Files
bds.mr.dpg/doc/tutorial/calc/calcParser.g
T
2026-01-03 18:31:15 +01:00

94 lines
2.2 KiB
Plaintext

// ============================================================================
// 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); }
;