AST Specification - m2sf/M2-AST-Node-Diagrams GitHub Wiki
Abstract Syntax Tree
The M2C/M2J/M2Sharp compilers encode valid Modula-2 input in memory as an abstract syntax tree (AST).
The AST uses three kinds of nodes.
- an
EMPTY
sentinel node - non-terminal nodes
- terminal nodes
The Sentinel Node
The sentinel node EMPTY
,
is used to encode the absence of an optional sub-node in non-terminal nodes.
Non-Terminal Nodes
Non-terminal nodes are used to encode non-terminal symbols such as modules, imports, definitions, declarations, statements and expressions.
AST
,
DEFMOD
,
IMPLIST
,
IMPORT
,
UNQIMP
,
DEFLIST
,
CONSTDEF
,
TYPEDEF
,
PROCDEF
,
SUBR
,
ENUM
,
SET
,
ARRAY
,
RECORD
,
EXTREC
,
VRNTREC
,
POINTER
,
PROCTYPE
,
INDEXLIST
,
FIELDLISTSEQ
,
FIELDLIST
,
VFLISTSEQ
,
VFLIST
,
VARIANTLIST
,
VARIANT
,
CLABELLIST
,
CLABELS
,
FTYPELIST
,
OPENARRAY
,
CONSTP
,
VARP
,
FPARAMLIST
,
FPARAMS
,
IMPMOD
,
BLOCK
,
DECLLIST
,
TYPEDECL
,
VARDECL
,
PROC
,
MODDECL
,
VSR
,
VSFIELD
,
EXPORT
,
QUALEXP
,
STMTSEQ
,
ASSIGN
,
PCALL
,
RETURN
,
WITH
,
IF
,
SWITCH
,
LOOP
,
WHILE
,
REPEAT
,
FORTO
,
EXIT
,
ARGS
,
ELSIFSEQ
,
ELSIF
,
CASELIST
,
CASE
,
ELEMLIST
,
RANGE
,
FIELD
,
INDEX
,
DESIG
,
DEREF
,
NOT
,
AND
,
OR
,
EQ
,
NEQ
,
LT
,
LTEQ
,
GT
,
GTEQ
,
IN
,
NEG
,
PLUS
,
MINUS
,
STAR
,
SLASH
,
DIV
,
MOD
,
SETDIFF
,
FCALL
,
SETVAL
.
Terminal Nodes
Terminal nodes are used to encode terminal symbols such as filenames, options, identifiers, integer literals, real number literals, character code and quoted literals.
FILENAME
,
OPTIONS
,
IDENT
,
IDENTLIST
,
QUALIDENT
,
INTVAL
,
REALVAL
,
CHRVAL
,
QUOTEDVAL
.
Graphical Representation
AST nodes are represented graphically as follows:
Non-Terminal Nodes
Nodes are represented by rectangular boxes. Arrows indicate subnode connections.
Terminal Nodes
The subnodes of terminal nodes are filled in grey.
Labels
Labels are represented by rounded boxes.
Alternatives
Labels with multiple connections represent alternatives.
Serialised Representation
Any AST node may be represented in a serialised format of the form
( nodetype subnode-0 subnode-1 subnode-2 ... subnode-N )
where the actual number of sub-nodes is dependent on the node type.
This form of tree representation is called an S-expression.
AST Node Reference
The structure of the common AST is described in detail below.
Empty Node
The EMPTY
node encodes the absence of an optional sub-node.
Graph
S-Expression
emptyNode :=
'(' EMPTY ')'
;
Root Node
The AST
node encodes the root of the syntax tree.
Graph
S-Expression
astRootNode :=
'(' AST filename options compilationUnit ')'
;
filename := filenameNode ; /* terminal node */
options := optionsNode ; /* terminal node */
compilationUnit :=
defModuleNode | impModuleNode
;
Definition Module Node
The DEFMOD
node encodes a definition module.
Graph
S-Expression
defModuleNode :=
'(' DEFMOD moduleIdent importList definitionList ')'
;
moduleIdent := identNode ; /* terminal node */
importList :=
importListNode | emptyNode
;
definitionList :=
definitionListNode | emptyNode
;
Import List Node
The IMPLIST
node encodes the entirety of import directives in a module.
Graph
S-Expression
importListNode :=
'(' IMPLIST import+ ')'
;
Import Nodes
There are two types of import nodes:
import :=
importNode | unqImportNode
;
Qualified Import Node
The IMPORT
node encodes a qualified import directive.
Graph
S-Expression
importNode :=
'(' IMPORT identList ')'
;
identList := identListNode ; /* terminal node */
Unqualified Import Node
The UNQIMP
node encodes an unqualified import directive.
Graph
S-Expression
unqImportNode :=
'(' UNQIMP moduleIdent identList ')'
;
Definition List Node
The DEFLIST
node encodes one or more definitions.
Graph
S-Expression
definitionListNode :=
'(' DEFLIST definition+ ')'
;
Definition Nodes
There are four types of definition nodes:
CONSTDEF
,
TYPEDEF
,
VARDECL
,
PROCDEF
.
definition :=
constDefNode | typeDefNode | varDeclNode | ProcDefNode
;
Constant Definition Node
The CONSTDEF
node encodes a constant definition.
Graph
S-Expression
constDefNode :=
'(' CONSTDEF identNode exprNode ')'
;
Type Definition Node
The TYPEDEF
node encodes a type definition.
Graph
S-Expression
typeDefNode :=
'(' TYPEDEF identNode ( typeNode | emptyNode ) ')'
;
Procedure Definition Node
The PROCDEF
node encodes a procedure definition.
Graph
S-Expression
procDefNode :=
'(' PROCDEF identNode formalParamList returnedType ')'
;
formalParamList :=
formalParamListNode | emptyNode
;
returnedType := qualidentNode ; /* terminal node */
Type Nodes
There are eleven nodes that may represent the definition part of a type definition or an anonymous type.
IDENT
,
QUALIDENT
,
SUBR
,
ENUM
,
SET
,
ARRAY
,
RECORD
,
EXTREC
,
VRNTREC
,
POINTER
,
PROCTYPE
.
typeNode :=
identNode | qualidentNode |
subrTypeNode | enumTypeNode | setTypeNode | arrayTypeNode | recTypeNode |
extRecTypeNode | vrntRecTypeNode | pointerTypeNode | procTypeNode
;
Nine nodes may represent the type definition part of a field definition or an array base type.
IDENT
,
QUALIDENT
,
SUBR
,
ENUM
,
SET
,
ARRAY
,
RECORD
,
POINTER
,
PROCTYPE
.
fieldType :=
identNode | qualidentNode | subrTypeNode | enumTypeNode | setTypeNode |
arrayTypeNode | recTypeNode | pointerTypeNode | procTypeNode
;
Three nodes may represent the type definition part of a derived type.
derivedType :=
identNode | qualidentNode | subrTypeNode
;
Three nodes represent the type definition part of a record type.
recordType :=
recTypeNode | extRecTypeNode | vrntRecTypeNode
;
Subrange Type Definition Node
The SUBR
node encodes a subrange type definition.
Graph
S-Expression
subrTypeNode :=
'(' SUBR lowerBound upperBound subrBaseType ')'
;
lowerBound := exprNode ;
upperBound := exprNode ;
subrBaseType :=
qualidentNode | emptyNode
;
Enumeration Type Definition Node
The ENUM
node encodes an enumeration type definition.
Graph
S-Expression
enumTypeNode :=
'(' ENUM identListNode ')'
;
Set Type Definition Node
The SET
node encodes a set type definition.
Graph
S-Expression
setTypeNode :=
'(' SET countableType ')'
;
countableType :=
qualidentNode | subrTypeNode | enumTypeNode
;
Array Type Definition Node
The ARRAY
node encodes an array type definition.
Graph
S-Expression
arrayTypeNode :=
'(' ARRAY indexTypeListNode arrayBaseType ')'
;
arrayBaseType := fieldType ;
Simple Record Type Definition Node
The RECORD
node encodes a non-variant non-extensible record type definition.
Graph
S-Expression
recTypeNode :=
'(' RECORD fieldListSeqNode ')'
;
Pointer Type Definition Node
The POINTER
node encodes a pointer type definition.
Graph
S-Expression
pointerTypeNode :=
'(' POINTER typeNode ')'
;
Procedure Type Definition Node
The PROCTYPE
node encodes a procedure type definition.
Graph
S-Expression
procTypeNode :=
'(' PROCTYPE formalTypeList returnedType ')'
;
formalTypeList :=
formalTypeListNode | emptyNode
;
returnedType :=
qualidentNode | emptyNode
;
Extensible Record Type Definition Node
The EXTREC
node encodes an extensible record type definition.
Graph
S-Expression
extRecTypeNode :=
'(' EXTREC recBaseType fieldListSeqNode ')'
;
recBaseType := qualidentNode ; /* terminal node */
Variant Record Type Definition Node
The VRNTREC
node encodes a variant record type definition.
Graph
S-Expression
variantRecTypeNode :=
'(' VRNTREC variantFieldListSeqNode ')'
;
Array Index Type List Node
The INDEXLIST
node encodes one or more index types within an array type definition.
Graph
S-Expression
indexTypeListNode :=
'(' INDEXLIST indexType+ ')'
;
indexType := countableType ;
Simple FieldList Sequence Node
The FIELDLISTSEQ
node encodes a non-variant field list sequence within a record type definition.
Graph
S-Expression
fieldListSeqNode :=
'(' FIELDLISTSEQ fieldListNode+ ')'
;
Simple FieldList Node
The FIELDLIST
node encodes a non-variant field list within a field list sequence
Graph
S-Expression
fieldListNode :=
'(' FIELDLIST identListNode fieldType ')'
;
Variant FieldList Sequence Node
The VFLISTSEQ
node encodes a field list sequence within a variant record type definition.
Graph
S-Expression
variantFieldListSeqNode :=
'(' VFLISTSEQ ( fieldListNode | variantFieldListNode )+ ')'
;
Variant Field List Node
The VFLIST
node encodes a variant field list within a variant record field list sequence.
Graph
S-Expression
variantFieldListNode :=
'(' VFLIST caseIdent caseType variantList defaultFieldListSeq ')'
;
caseIdent :=
identNode | emptyNode
;
caseType := qualidentNode ; /* terminal node */
defaultFieldListSeq :=
fieldListSeqNode | emptyNode
;
Variant List Node
The VARIANTLIST
node encodes a variant list within a variant field list.
Graph
S-Expression
variantList :=
'(' VARIANTLIST variantNode+ ')'
;
Variant Node
The VARIANT
node encodes a variant within a variant list.
Graph
S-Expression
variantNode :=
'(' VARIANT caseLabelListNode fieldListSeqNode ')'
;
Case Label List Node
The CLABELLIST
node encodes a case label list within a variant record definition or case statement.
Graph
S-Expression
caseLabelListNode :=
'(' CLABELLIST caseLabelsNode+ ')
;
Case Labels Node
The CLABELS
node encodes start and end labels within a case label list.
Graph
S-Expression
caseLabelsNode :=
'(' CLABELS startLabel endLabel ')'
;
startLabel := exprNode ;
endLabel :=
exprNode | emptyNode
;
Formal Type List Node
The FTYPELIST
node encodes a formal type list within a procedure type definition.
Graph
S-Expression
formalTypeListNode :
'(' FTYPELIST formalType+ ')'
;
formalType :=
simpleFormalType | attrFormalType
;
simpleFormalType :=
typeIdent | openArrayTypeNode
;
attrFormalType :=
constAttrFormalTypeNode | varAttrFormalTypeNode
;
Open Array Parameter Node
The OPENARRAY
node encodes an open array parameter within a formal type list.
Graph
S-Expression
openArrayTypeNode :=
'(' OPENARRAY typeIdent ')'
;
typeIdent := qualidentNode ; /* terminal node */
CONST Parameter Node
The CONSTP
node encodes a CONST
parameter within a formal type list.
Graph
S-Expression
constAttrFormalTypeNode :=
'(' CONSTP simpleFormalType ')'
;
VAR Parameter Node
The VARP
node encodes a VAR
parameter within a formal type list.
Graph
S-Expression
varAttrFormalTypeNode :=
'(' VARP simpleFormalType ')'
;
Formal Parameter List Node
The FPARAMLIST
node encodes a formal parameter list within a procedure type definition or procedure signature.
Graph
S-Expression
formalParamListNode :=
'(' FPARAMLIST formalParamsNode+ ')'
;
Formal Parameters Node
The FPARAMS
node encodes formal parameters within a formal parameter list.
Graph
S-Expression
formalParamsNode :=
'(' FPARAMS identListNode formalTypeNode ')'
;
Program Or Implementation Module Node
The IMPMOD
node encodes an implementation module.
Graph
S-Expression
impModuleNode :=
'(' IMPMOD moduleIdent importListNode blockNode ')'
;
Block Node
The BLOCK
node encodes a block within a module or procedure.
Graph
S-Expression
blockNode :=
'(' BLOCK declarationList body ')'
;
declarationList :=
declarationListNode | emptyNode
;
body :=
statementSeqNode | emptyNode
;
Declaration List Node
The DECLLIST
node encodes one or more declarations within a block.
Graph
S-Expression
declarationListNode :=
'(' DECLLIST declarationNode+ ')'
;
Declaration Nodes
There are five types of declaration nodes:
CONSTDEF
,
TYPEDECL
,
VARDECL
,
PROC
,
MODDECL
.
declarationNode :=
constDefNode | typeDeclNode | varDeclNode | procDeclNode | modDeclNode
;
Type Declaration Node
The TYPEDECL
node encodes a type declaration.
Graph
S-Expression
typeDeclNode :=
'(' TYPEDECL identNode ( typeNode | vsrTypeNode ) ')'
;
Variable Declaration Node
The VARDECL
node encodes a variable or field declaration.
Graph
S-Expression
varDeclNode :=
'(' VARDECL identListNode fieldType ')'
;
Procedure Declaration Node
The PROC
node encodes a procedure declaration.
Graph
S-Expression
procDeclNode :=
'(' PROC identNode formalParamListNode returnedType blockNode ')'
;
Module Declaration Node
The MODDECL
node encodes a local module declaration.
Graph
S-Expression
modDeclNode :=
'(' MODDECL moduleIdent importListNode exportList blockNode ')'
;
exportList :=
unqualExportNode | qualExportNode | emptyNode
;
Variable Size Record Type Declaration Node
The VSR
node encodes a variable size record type declaration.
Graph
S-Expression
vsrTypeNode :=
'(' VSR fieldListSeqNode varSizeFieldNode ')'
;
Variable Size Field Node
The VSFIELD
node encodes the indeterminate field of a variable size record type.
Graph
S-Expression
varSizeFieldNode :=
'(' VSFIELD varSizeField determinantField varSizeFieldType ')'
;
varSizeField := identNode ; /* terminal node */
determinantField := identNode ; /* terminal node */
varSizeFieldType := qualidentNode ; /* terminal node */
Unqualified Export Node
The EXPORT
node encodes an unqualified export directive within a local module declaration.
Graph
S-Expression
unqualExportNode :=
'(' EXPORT identListNode ')'
;
Qualified Export Node
The QUALEXP
node encodes a qualified export directive within a local module declaration.
Graph
S-Expression
qualExportNode :=
'(' QUALEXP identListNode ')'
;
Statement Sequence Node
The STMTSEQ
node encodes a statement sequence.
Graph
S-Expression
statementSeqNode :=
'(' STMTSEQ statementNode+ ')'
;
Statement Nodes
There are eleven types of statement nodes:
ASSIGN
,
PCALL
,
RETURN
,
WITH
,
IF
,
SWITCH
,
LOOP
,
WHILE
,
REPEAT
,
FORTO
,
EXIT
.
statementNode :=
assignmentNode | controlStmt | withStmtNode
;
Nine statement nodes represent control statements:
PCALL
,
RETURN
,
IF
,
SWITCH
,
LOOP
,
WHILE
,
REPEAT
,
FORTO
,
EXIT
.
controlStmt :=
procCallNode | returnStmtNode | ifStmtNode | caseStmtNode | loopCtrlStmt
;
Five statement nodes represent loop control statements:
LOOP
,
WHILE
,
REPEAT
,
FORTO
,
EXIT
.
loopCtrlStatement :=
loopStmtNode | whileStmtNode | repeatStmtNode | ForToStmtNode | exitStmtNode
;
Assignment Node
The ASSIGN
node encodes an assignment statement.
Graph
S-Expression
assignmentNode :=
'(' ASSIGN designator exprNode ')'
;
designator :=
identNode | qualidentNode | derefNode | designatorNode
;
Procedure Call Node
The PCALL
node encodes a procedure call statement.
Graph
S-Expression
procCallNode :=
'( PCALL designator actualParams ')'
;
actualParams :=
actualParamsNode | emptyNode
;
RETURN Statement Node
The RETURN
node encodes a RETURN
statement.
Graph
S-Expression
returnStmtNode :=
'(' RETURN returnValue ')'
;
returnValue :=
exprNode | emptyNode
;
WITH Statement Node
The WITH
node encodes a WITH
statement.
Graph
S-Expression
withStmtNode :=
'(' WITH designator statementSeqNode ')'
;
IF Statement Node
The IF
node encodes an IF
statement.
Graph
S-Expression
ifStmtNode :=
'(' IF exprNode ifBranch elsifSeq elseBranch ')'
;
ifBranch := statementSeqNode ;
elsifSeq :=
elsifSeqNode | emptyNode
;
elseBranch :=
statementSeqNode | emptyNode
;
CASE Statement Node
The SWITCH
node encodes a CASE
statement.
Graph
S-Expression
caseStmtNode :=
'(' SWITCH designator caseListNode elseBranch ')'
;
LOOP Statement Node
The LOOP
node encodes a LOOP
statement.
Graph
S-Expression
loopStmtNode :=
'(' LOOP statementSeqNode ')'
;
WHILE Statement Node
The WHILE
node encodes a WHILE
statement.
Graph
S-Expression
whileStmtNode :=
'(' WHILE exprNode statementSeqNode ')'
;
REPEAT Statement Node
The REPEAT
node encodes a REPEAT
statement.
Graph
S-Expression
repeatStmtNode :=
'(' REPEAT statementSeqNode exprNode ')'
;
FOR Statement Node
The FORTO
node encodes a FOR
statement.
Graph
S-Expression
forToStmtNode :=
'(' FORTO identNode startValue endValue stepValue statementSeqNode ')'
;
startValue : exprNode ;
endValue := expNode ;
stepValue :=
exprNode | emptyNode
;
EXIT Statement Node
The EXIT
node encodes an EXIT
statement.
Graph
S-Expression
exitStmtNode :=
'(' EXIT ')'
;
Actual Parameters Node
The ARGS
node encodes actual parameters in a procedure or function call.
Graph
S-Expression
actualParamsNode :=
'(' ARGS exprNode+ ')'
;
ELSIFSEQ Node
The ELSIFSEQ
node encodes an ELSIF
sequence within an IF
statement.
Graph
S-Expression
elsifSeqNode :=
'(' ELSIFSEQ elsifNode+ ')'
;
ELSIF Node
The ELSIF
node encodes a single ELSIF
branch within an IF
statement.
Graph
S-Expression
elsifNode :=
'(' ELSIF exprNode statementSeqNode ')'
;
CASE List Node
The CASELIST
node encodes a case list within a CASE
statement.
Graph
S-Expression
caseListNode :=
'(' CASELIST caseBranchNode+ ')'
;
CASE Branch Node
The CASE
node encodes a case branch within a CASE
statement.
Graph
S-Expression
caseBranchNode :=
'(' CASE caseLabelListNode statementSeqNode ')'
;
Set Element List Node
The ELEMLIST
node encodes the element list within a set value.
Graph
S-Expression
elementListNode :=
'(' ELEMLIST element+ ')'
;
element :=
expr | range
;
Expression Range Node
The RANGE
node encodes a value range.
Graph
S-Expression
range :=
'(' RANGE lowerValue upperValue ')'
;
lowerValue := exprNode ;
upperValue := exprNode ;
Record Field Selector Node
The FIELD
node encodes a record field selector.
Graph
S-Expression
fieldSelectorNode :=
'(' FIELD selector ')'
;
selector :=
qualidentNode | designatorNode
;
Array Index Node
The INDEX
node encodes an array subscript selector.
Graph
S-Expression
arrayIndexNode :=
'(' INDEX subscript+ ')'
;
subscript := exprNode ;
Designator Node
The DESIG
node encodes a designator.
Graph
S-Expression
designatorNode :=
'(' DESIG head tail ')'
;
head :=
qualidentNode | derefNode
;
tail :=
fieldSelectorNode | arrayIndexNode | emptyNode
;
Pointer Dereference Node
The DEREF
node encodes a pointer dereference.
Graph
S-Expression
derefNode :=
'(' DEREF pointer ')'
;
pointer :=
qualident | derefNode | designatorNode
;
Expression Nodes
There are 25 nodes that may represent expressions or sub-expressions:
NOT
,
AND
,
OR
,
EQ
,
NEQ
,
LT
,
LTEQ
,
GT
,
GTEQ
,
IN
,
NEG
,
PLUS
,
MINUS
,
STAR
,
SLASH
,
DIV
,
MOD
,
SETDIFF
,
DESIG
,
FCALL
,
SETVAL
.
INTVAL
,
REALVAL
,
CHRVAL
,
QUOTEDVAL
.
expr :=
boolExpr | relationalExpr | arithmeticExpr |
designator | funcCallNode | setValNode | literalValue
;
There are three boolean expression nodes:
boolExpr :=
notNode | andNode | orNode
;
There are seven relational expression nodes:
EQ
,
NEQ
,
LT
,
LTEQ
,
GT
,
GTEQ
,
IN
.
relationalExpr :=
eqNode | neqNode | ltNode | ltEqNode | gtNode | gtEqNode | inNode
;
There are eight arithmetic expression nodes:
NEG
,
PLUS
,
MINUS
,
STAR
,
SLASH
,
DIV
,
MOD
,
SETDIFF
.
arithmeticExpr :=
negNode | plusNode | minusNode | starNode | slashNode |
divNode | modulusNode | setDiffNode
;
There are four literal value expression nodes:
INTVAL
,
REALVAL
,
CHRVAL
,
QUOTEDVAL
.
literalValue :=
intValNode | realValNode | chrValNode | quotedValNode
;
Logical Negation Expression Node
The NOT
node encodes an expression of the form NOT expr
.
Graph
S-Expression
notNode :=
'(' NOT right ')'
;
Logical Conjunction Expression Node
The AND
node encodes an expression of the form expr1 AND expr2
.
Graph
S-Expression
andNode :=
'(' AND left right ')'
;
Logical Disjunction Expression Node
The OR
node encodes an expression of the form expr1 OR expr2
.
Graph
S-Expression
orNode :=
'(' OR left right ')'
;
Equality Expression Node
The EQ
node encodes an expression of the form expr1 = expr2
.
Graph
S-Expression
eqNode :=
'(' EQ left right ')'
;
left : exprNode ;
Inequality Expression Node
The NEQ
node encodes an expression of the form expr1 # expr2
.
Graph
S-Expression
neqNode :=
'(' NEQ left right ')'
;
Less-Than Expression Node
The LT
node encodes an expression of the form expr1 < expr2
.
Graph
S-Expression
ltNode :=
'(' LT left right ')'
;
Less-Than-Or-Equal Expression Node
The LTEQ
node encodes an expression of the form expr1 <= expr2
.
Graph
S-Expression
ltEqNode :=
'(' LTEQ left right ')'
;
Greater-Than Expression Node
The GT
node encodes an expression of the form expr1 > expr2
.
Graph
S-Expression
gtNode :=
'(' GT left right ')'
;
Greater-Than-Or-Equal Expression Node
The GTEQ
node encodes an expression of the form expr1 >= expr2
.
Graph
S-Expression
gtEqNode :=
'(' GTEQ left right ')'
;
Set Membership Expression Node
The IN
node encodes an expression of the form expr1 IN expr2
.
Graph
S-Expression
inNode :=
'(' IN left right ')'
;
Arithmetic Negation Expression Node
The NEG
node encodes an expression of the form - expr
.
Graph
S-Expression
negNode :=
'(' NEG right ')'
;
right : exprNode ;
Plus Expression Node
The PLUS
node encodes an expression of the form expr1 + expr2
.
Graph
S-Expression
plusNode :=
'(' PLUS left right ')'
;
Minus Expression Node
The MINUS
node encodes an expression of the form expr1 - expr2
.
Graph
S-Expression
minusNode :=
'(' MINUS left right ')'
;
Star Expression Node
The STAR
node encodes an expression of the form expr1 * expr2
.
Graph
S-Expression
starNode :=
'(' STAR left right ')'
;
Slash Expression Node
The SLASH
node encodes an expression of the form expr1 / expr2
.
Graph
S-Expression
slashNode :=
'(' SLASH left right ')'
;
Euclidean Division Expression Node
The DIV
node encodes an expression of the form expr1 DIV expr2
.
Graph
S-Expression
divNode :=
'(' DIV left right ')'
;
Remainder of Euclidean Division Expression Node
The MOD
node encodes an expression of the form expr1 MOD expr2
.
Graph
S-Expression
modulusNode :=
'(' MOD left right ')'
;
Set Difference Expression Node
The SETDIFF
node encodes an expression of the form expr1 \ expr2
.
Graph
S-Expression
setDiffNode :=
'(' SETDIFF left right ')'
;
Function Call Expression Node
The FCALL
node encodes a function call expression.
Graph
S-Expression
funcCallNode :=
'( FCALL designator actualParams ')'
;
Set Value Expression Node
The SETVAL
node encodes a set value expression.
Graph
S-Expression
setValNode :=
'( SETVAL elementList setTypeIdent ')'
;
elementList :=
actualParams | emptyNode
;
setTypeIdent :=
ident | qualident | emptyNode
;
Filename Node
The FILENAME
node encodes the filename of the source file.
Graph
S-Expression
filenameNode :=
'(' FILENAME '"' filename '"' ')'
;
Example
(FILENAME "parser.mod")
Compiler Options Node
The OPTIONS
node encodes the compiler options used when compiling the source file.
Graph
S-Expression
optionsNode :=
'(' OPTIONS ( '"' option-name '"' )+ ')'
;
Example
(OPTIONS "--pim4" "--no-synonyms" "--no-coroutines" ...)
Identifier Node
The IDENT
node encodes an identifier.
Graph
S-Expression
identNode :=
'(' IDENT '"' Ident '"' ')'
;
Example
(IDENT "foobar")
Identifier List Node
The IDENTLIST
node encodes an identifier list.
Graph
S-Expression
identListNode :=
'(' IDENTLIST ( '"' Ident '"' )+ ')'
;
Example
(IDENTLIST "foo" "bar" "baz" ...)
Qualified Identifier Node
The QUALIDENT
node encodes the component identifiers of a qualified identifier.
Graph
S-Expression
qualidentNode :=
'(' QUALIDENT ( '"' Ident '"' ) ( '"' Ident '"' )+ ')'
;
Example
(QUALIDENT "foo" "bar" ...)
Whole Number Value Node
The INTVAL
node encodes a whole number value.
Graph
S-Expression
intValNode :=
'(' INTVAL ( lexeme | '#' lexeme ) ')'
;
Examples
(INTVAL 12345)
(INTVAL #0x7FFF)
Real Number Value Node
The REALVAL
node encodes a real number value.
Graph
S-Expression
realValNode :=
'(' REALVAL lexeme ')'
;
Examples
(REALVAL 1.234)
(REALVAL 5.678e9)
Character Code Value Node
The CHRVAL
node encodes a character code value.
Graph
S-Expression
chrValNode :=
'(' CHRVAL '#' lexeme ')'
;
Example
(CHRVAL #0u7F)
Quoted Character or String Value Node
The QUOTEDVAL
node encodes a quoted character or string value.
Graph
S-Expression
quotedValNode :=
'(' QUOTEDVAL '"' lexeme '"' ')'
;
Example
(QUOTEDVAL "quoted character or string")
+++