94 lines
2.2 KiB
Plaintext
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); }
|
|
;
|