// ============================================================================ // Demo parser for four operator calculator // ============================================================================ unit calcParser; parser TcalcParser; options { importVocab = calcLexer; exportVocab = calcParser; // k = 2; } // ============================================================================ // calc // ============================================================================ calc local { v: integer; } : (v=expression SEMI {writeln(v);} )+ ; // ============================================================================ // expression // ============================================================================ expression returns [integer] : result=simpleExpression ; // ============================================================================ // simpleExpression // ============================================================================ simpleExpression returns [integer] local { v : integer; } : result=term ( PLUS v=term { result := result + v; } | MINUS v=term { result := result - v; } )* ; // ============================================================================ // term // ============================================================================ term returns [integer] local { v : integer; } : result=factor ( STAR v=factor { result := result * v; } | SLASH v=factor { result := result div v; } )* ; // ============================================================================ // factor // ============================================================================ factor returns [integer] local { s: integer; } { s := 1; } : ( PLUS { s := 1; } | MINUS { s := -1; } )? ( result=uInt | LPAREN result=expression RPAREN ) { result := s * result; } ; // ============================================================================ // uInt // ============================================================================ uInt returns [integer] : x:INT { result := StrToInt( x.TokenText); } ;