Initial check in docu
This commit is contained in:
@@ -0,0 +1,368 @@
|
||||
unit wpParser;
|
||||
|
||||
parser TwpParser;
|
||||
options
|
||||
{
|
||||
importVocab = wpLexer;
|
||||
k = 2;
|
||||
}
|
||||
|
||||
// ============================================================================
|
||||
// prog
|
||||
// ============================================================================
|
||||
prog
|
||||
: "program" id (LPAREN id (COLON id)* RPAREN)? SEMI block DOT
|
||||
;
|
||||
|
||||
// ============================================================================
|
||||
// block
|
||||
// ============================================================================
|
||||
block
|
||||
: declarations compoundStmt
|
||||
;
|
||||
|
||||
// ============================================================================
|
||||
// declarations
|
||||
// ============================================================================
|
||||
declarations
|
||||
:
|
||||
( "label" UINT (COMMA UINT)* SEMI )?
|
||||
( "const" (id EQ constant SEMI)+ )?
|
||||
( "type" (id EQ typeSpec SEMI)+ )?
|
||||
( "var" (id (COMMA id)* COLON typeSpec SEMI)+ )?
|
||||
|
||||
(
|
||||
"procedure" id parameterList SEMI block SEMI
|
||||
| "function" id parameterList COLON id SEMI block SEMI
|
||||
)*
|
||||
;
|
||||
|
||||
// ============================================================================
|
||||
// statement
|
||||
// ============================================================================
|
||||
statement
|
||||
: (UINT COLON)?
|
||||
(
|
||||
(variable ASSIGN) => assignmentStmt
|
||||
| procedureCall
|
||||
| compoundStmt
|
||||
| ifStmt
|
||||
| caseStmt
|
||||
| whileStmt
|
||||
| repeatStmt
|
||||
| forStmt
|
||||
| withStmt
|
||||
| gotoStmt
|
||||
)?
|
||||
;
|
||||
|
||||
// ============================================================================
|
||||
// assignmentStmt
|
||||
// ============================================================================
|
||||
assignmentStmt
|
||||
: variable ASSIGN expression
|
||||
;
|
||||
|
||||
// ============================================================================
|
||||
// procedureCall
|
||||
// ============================================================================
|
||||
procedureCall
|
||||
: id (LPAREN expression (widthSpec)? (COMMA expression (widthSpec)? )* RPAREN)?
|
||||
;
|
||||
|
||||
// ============================================================================
|
||||
// widthSpec
|
||||
// ============================================================================
|
||||
widthSpec
|
||||
: (COLON UINT) (COLON UINT)?
|
||||
;
|
||||
|
||||
|
||||
// ============================================================================
|
||||
// compoundStmt
|
||||
// ============================================================================
|
||||
compoundStmt
|
||||
: "begin" (statement (SEMI statement)*)? "end"
|
||||
;
|
||||
|
||||
// ============================================================================
|
||||
// ifStmt
|
||||
// ============================================================================
|
||||
ifStmt
|
||||
: "if" expression "then" statement
|
||||
(
|
||||
("else") => "else" statement
|
||||
|
|
||||
)
|
||||
;
|
||||
|
||||
// ============================================================================
|
||||
// caseStmt
|
||||
// ============================================================================
|
||||
caseStmt
|
||||
: "case" expression "of"
|
||||
( caseStmtItem (SEMI caseStmtItem)* )?
|
||||
"end"
|
||||
;
|
||||
|
||||
// ============================================================================
|
||||
// caseStmtItem
|
||||
// ============================================================================
|
||||
caseStmtItem
|
||||
: constant (COMMA constant)* COLON statement
|
||||
;
|
||||
|
||||
// ============================================================================
|
||||
// whileStmt
|
||||
// ============================================================================
|
||||
whileStmt
|
||||
: "while" expression "do" statement
|
||||
;
|
||||
|
||||
// ============================================================================
|
||||
// repeatStmt
|
||||
// ============================================================================
|
||||
repeatStmt
|
||||
: "repeat" (statement (SEMI statement)*)? "until" expression
|
||||
;
|
||||
|
||||
// ============================================================================
|
||||
// forStmt
|
||||
// ============================================================================
|
||||
forStmt
|
||||
: "for" id ASSIGN expression ("to" | "downto") expression "do" statement
|
||||
;
|
||||
|
||||
// ============================================================================
|
||||
// withStmt
|
||||
// ============================================================================
|
||||
withStmt
|
||||
: "with" variable (COMMA variable)* "do" statement
|
||||
;
|
||||
|
||||
// ============================================================================
|
||||
// gotoStmt
|
||||
// ============================================================================
|
||||
gotoStmt
|
||||
: "goto" UINT
|
||||
;
|
||||
|
||||
|
||||
// ============================================================================
|
||||
// parameterList
|
||||
// ============================================================================
|
||||
parameterList
|
||||
: (
|
||||
LPAREN
|
||||
parameter (SEMI parameter)*
|
||||
RPAREN
|
||||
)?
|
||||
;
|
||||
|
||||
// ============================================================================
|
||||
// parameter
|
||||
// ============================================================================
|
||||
parameter
|
||||
: ("var" | "function")? id (COMMA id)* COLON typeId
|
||||
| "procedure" id (COMMA id)*
|
||||
;
|
||||
|
||||
|
||||
// ============================================================================
|
||||
// expression
|
||||
// ============================================================================
|
||||
expression
|
||||
: simpleExpression (relOp simpleExpression)*
|
||||
;
|
||||
|
||||
// ============================================================================
|
||||
// simpleExpression
|
||||
// ============================================================================
|
||||
simpleExpression
|
||||
: (PLUS|MINUS)? term (addOp term)*
|
||||
;
|
||||
|
||||
// ============================================================================
|
||||
// term
|
||||
// ============================================================================
|
||||
term
|
||||
: factor (mulOp factor)*
|
||||
;
|
||||
|
||||
// ============================================================================
|
||||
// factor
|
||||
// ============================================================================
|
||||
factor
|
||||
: uNumber
|
||||
| "nil"
|
||||
| CHAR
|
||||
| STRING
|
||||
| (id LPAREN) => procedureCall
|
||||
| variable
|
||||
| LPAREN expression RPAREN
|
||||
| "not" factor
|
||||
| LBRACKET (expression (RANGE expression)? (COMMA expression (RANGE expression)? )* )? RBRACKET
|
||||
;
|
||||
|
||||
// ============================================================================
|
||||
// variable
|
||||
// ============================================================================
|
||||
variable
|
||||
: variableId
|
||||
(
|
||||
LBRACKET expression (COMMA expression)* RBRACKET
|
||||
| DOT fieldId
|
||||
| PTR
|
||||
)*
|
||||
;
|
||||
|
||||
// ============================================================================
|
||||
// fieldList
|
||||
// ============================================================================
|
||||
fieldList
|
||||
: simpleFieldList (simpleFieldList)* (variantFieldList)?
|
||||
|
|
||||
;
|
||||
|
||||
// ============================================================================
|
||||
// simpleFieldList
|
||||
// ============================================================================
|
||||
simpleFieldList
|
||||
: id (COMMA id)* COLON typeSpec
|
||||
;
|
||||
|
||||
// ============================================================================
|
||||
// caseFieldList
|
||||
// ============================================================================
|
||||
variantFieldList
|
||||
: "case" (id COLON)? typeId "of"
|
||||
constant (COMMA constant)* COLON LPAREN fieldList RPAREN
|
||||
(SEMI constant (COMMA constant)* COLON LPAREN fieldList RPAREN)*
|
||||
;
|
||||
|
||||
// ============================================================================
|
||||
// typeSpecification
|
||||
// ============================================================================
|
||||
typeSpec
|
||||
: simpleType
|
||||
| PTR typeId
|
||||
| ("packed")?
|
||||
(
|
||||
"array" LBRACKET simpleType (COMMA simpleType)* RBRACKET "of" typeSpec
|
||||
| "file" "of" typeSpec
|
||||
| "set" "of" simpleType
|
||||
| "record" fieldList "end"
|
||||
)
|
||||
;
|
||||
|
||||
// ============================================================================
|
||||
// simpleType
|
||||
// ============================================================================
|
||||
simpleType
|
||||
: (constant RANGE) => constant RANGE constant
|
||||
| typeId
|
||||
| LPAREN id (COMMA id)* RPAREN
|
||||
;
|
||||
|
||||
// ============================================================================
|
||||
// constant
|
||||
// ============================================================================
|
||||
constant
|
||||
: (PLUS | MINUS)? (constantId | uNumber)
|
||||
| CHAR
|
||||
;
|
||||
|
||||
// ============================================================================
|
||||
// unsignedConstant
|
||||
// ============================================================================
|
||||
uConstant
|
||||
: constantId
|
||||
| uNumber
|
||||
| "nil"
|
||||
| CHAR
|
||||
;
|
||||
|
||||
// ============================================================================
|
||||
// unumber
|
||||
// ============================================================================
|
||||
uNumber
|
||||
: UINT
|
||||
| UREAL
|
||||
;
|
||||
|
||||
// ============================================================================
|
||||
// uint
|
||||
// ============================================================================
|
||||
uInt
|
||||
: UINT;
|
||||
|
||||
// ============================================================================
|
||||
// fieldId
|
||||
// ============================================================================
|
||||
fieldId
|
||||
: id
|
||||
;
|
||||
|
||||
// ============================================================================
|
||||
// variableId
|
||||
// ============================================================================
|
||||
variableId
|
||||
: id
|
||||
;
|
||||
|
||||
// ============================================================================
|
||||
// typeId
|
||||
// ============================================================================
|
||||
typeId
|
||||
: id
|
||||
;
|
||||
|
||||
// ============================================================================
|
||||
// constantId
|
||||
// ============================================================================
|
||||
constantId
|
||||
: id
|
||||
;
|
||||
|
||||
// ============================================================================
|
||||
// id
|
||||
// ============================================================================
|
||||
id
|
||||
: ID
|
||||
;
|
||||
|
||||
// ============================================================================
|
||||
// relOp
|
||||
// ============================================================================
|
||||
relOp
|
||||
: GT
|
||||
| LT
|
||||
| GE
|
||||
| LE
|
||||
| NE
|
||||
| EQ
|
||||
| "in"
|
||||
;
|
||||
|
||||
// ============================================================================
|
||||
// addOp
|
||||
// ============================================================================
|
||||
addOp
|
||||
: PLUS
|
||||
| MINUS
|
||||
| "or"
|
||||
| "xor"
|
||||
;
|
||||
|
||||
// ============================================================================
|
||||
// mulOp
|
||||
// ============================================================================
|
||||
mulOp
|
||||
: STAR
|
||||
| SLASH
|
||||
| "div"
|
||||
| "mod"
|
||||
| "and"
|
||||
;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user