102 lines
2.8 KiB
Plaintext
102 lines
2.8 KiB
Plaintext
unit hocParser;
|
|
|
|
// ============================================================================
|
|
// Parser class declaration
|
|
// ============================================================================
|
|
parser ThocParser;
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// Parser options
|
|
// ----------------------------------------------------------------------------
|
|
options
|
|
{
|
|
k = 2;
|
|
importVocab = hocLexer;
|
|
exportVocab = hocParser;
|
|
}
|
|
|
|
// ============================================================================
|
|
// Begin rule definitions
|
|
//
|
|
// Remember: All parser rule names must begin with LOWERCASE letter!
|
|
// ============================================================================
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// prog
|
|
// ----------------------------------------------------------------------------
|
|
prog
|
|
local
|
|
{
|
|
val : double;
|
|
}
|
|
:
|
|
(
|
|
(
|
|
val = expression
|
|
)?
|
|
|
|
NEWLINE
|
|
)*
|
|
;
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// expression
|
|
// ----------------------------------------------------------------------------
|
|
expression returns [double]
|
|
local
|
|
{
|
|
val : double;
|
|
}
|
|
: result = term
|
|
(
|
|
PLUS val = term { result := result + val; }
|
|
| MINUS val = term { result := result - val; }
|
|
)*
|
|
;
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// term
|
|
// ----------------------------------------------------------------------------
|
|
term returns [double]
|
|
local
|
|
{
|
|
val : double;
|
|
}
|
|
: result = factor
|
|
(
|
|
STAR val = factor { result := result * val; }
|
|
| SLASH val = factor { result := result / val; }
|
|
)*
|
|
;
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// factor
|
|
// ----------------------------------------------------------------------------
|
|
factor returns [double]
|
|
: result = uNumber
|
|
| LPAREN result = expression RPAREN
|
|
;
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// uNumber
|
|
// ----------------------------------------------------------------------------
|
|
uNumber returns [double]
|
|
: n:UNUMBER
|
|
{
|
|
result := StrToIntDef( n.TokenText);
|
|
}
|
|
;
|
|
|
|
// ============================================================================
|
|
// End rule definitions
|
|
// ============================================================================
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// This section is used for generating member defintions in the unit 'hocParser'.
|
|
// The content of the section is verbatim copied into the generated code.
|
|
// ----------------------------------------------------------------------------
|
|
memberdef
|
|
{
|
|
}
|
|
|