-
Notifications
You must be signed in to change notification settings - Fork 0
Abstract Syntax Tree
Benjamin Kowarsch edited this page Jun 15, 2023
·
35 revisions
fileNode :=
'(' FILE filenameNode moduleKeyNode moduleNode ')'
;
moduleNode :=
ifcModuleNode | impModuleNode | pgmModuleNode ;
ifcModuleNode :=
'(' INTERFACE moduleIdentNode impListNode rxpListNode declListNode ')'
;
alias moduleIdentNode = identNode ;
impModuleNode :=
'(' IMPLEMENTATION moduleIdentNode impListNode defListNode blockNode ')'
;
pgmModuleNode :=
'(' PROGRAM moduleIdentNode impListNode defListNode blockNode ')'
;
declListNode :=
'(' DECL-LIST defOrDeclNode+ ')'
;
defOrDeclNode :=
constDefListNode | typeDefListNode |
typeDeclListNode| varDeclListNode | procDeclListNode ;
defListNode :=
'(' DEF-LIST defNode+ ')'
;
defNode :=
constDefNode | typeDefNode | varDefNode | procDefNode
;
constDefNode :=
'(' CONSTDEF identNode ( typeIdentNode | emptyNode ) exprNode ')'
;
alias typeIdentNode = identNode ;
typeDeclNode :=
'(' TYPEDECL identNode opaqueTypeNode ')'
;
typeDefNode :=
'(' TYPEDEF identNode typeNode ')'
;
typeNode :=
derivedTypeNode | aliasTypeNode | subrTypeNode | enumTypeNode | setTypeNode |
arrayTypeNode | recTypeNode | pointerTypeNode | procTypeNode
;
alias derivedTypeNode = typeIdentNode ;
varDeclNode :=
'(' VARDECL identNode ( typeIdentNode | anonTypeNode ) ')'
;
varDefNode :=
'(' VARDEF identNode ( typeIdentNode | anonTypeNode ) ')'
;
anonTypeNode :=
subrTypeNode | arrayTypeNode | procTypeNode
;
procDeclNode :=
'(' PROCDECL procSigNode ')'
;
procDefNode :=
'(' PROCDEF procSigNode blockNode ')'
;
constBindNode :=
'(' BIND-CONST constIdentNode constBindSpecNode ')'
;
alias constIdentNode = identNode ;
procBindNode :=
'(' BIND-PROC procIdentNode procBindSpecNode ')'
;
alias procIdentNode identNode ;
procSigNode :=
'(' PSIG identNode formalParamListNode retTypeNode ')'
;
alias retTypeNode = typeIdentNode ;
formalParamListNode := formalParamsNode | formalParamsSeqNode ;
formalParamsSeqNode :=
'(' FPSEQ formalParamsNode+ ')'
;
formalParamsNode := byvalParamsNode | byrefParamsNode | constParamsNode ;
byvalParamsNode :=
'(' BYVAL paramIdentListNode formalTypeNode ')'
;
paramIdentListNode := identNode | identListNode ;
byrefParamsNode :=
'(' BYREF paramIdentListNode formalTypeNode ')'
;
constParamsNode :=
'(' CONSTREF paramIdentListNode formalTypeNode ')'
;
formalTypeNode :=
typeIdentNode | openArrayTypeNode | arglistTypeNode | castingTypeNode
;
openArrayTypeNode :=
'(' OAP typeIdentNode ')'
;
arglistTypeNode :=
'(' ARGLIST typeIdentNode ')'
;
castingTypeNode :=
'(' CAST castingType ')'
;
castingType := (IDENT "ADDRESS") | (IDENT "OCTETSEQ") ;
aliasTypeNode :=
'(' ALIAS baseTypeNode ')'
;
alias baseTypeNode = typeIdentNode ;
subrangeTypeNode :=
'(' SUBR baseTypeNode rangeNode ')'
;
rangeNode :=
'(' RANGE lowerBound upperBound ')'
;
alias lowerBound, upperBound = exprNode ;
enumTypeNode :=
'(' ENUM enumBaseTypeNode enumValueListNode ')'
;
enumBaseTypeNode := typeIdentNode | emptyNode ;
alias enumValueListNode = identListNode ;
setTypeNode :=
'(' SET baseTypeNode ')'
;
arrayTypeNode :=
'(' ARRAY baseTypeNode capacityNode ')'
;
alias capacityNode = intValueNode ;
recordTypeNode :=
'(' RECORD recBaseTypeNode fieldListSeqNode ')'
;
recBaseTypeNode := typeIdentNode | emptyNode ;
fieldListSeqNode :=
'(' FIELD-LIST-SEQ fieldListNode+ ')'
;
alias fieldListNode = varDefNode ;
pointerTypeNode :=
'(' POINTER targetTypeNode ')'
;
alias targetTypeNode = qualidentNode ;
opaqueTypeNode :=
'(' OPAQUE allocSizeNode ')'
;
allocSizeNode = exprNode | emptyNode ;
procTypeNode :=
'(' PROC-TYPE formalTypeListNode retTypeNode ')'
;
stmtSeqNode :=
'(' STMTSEQ statementNode+ ')'
;
statementNode :=
assignStmtNode | copyStmtNode | procCallNode | returnStmtNode | newStmtNode |
newArgStmtNode | newCapStmtNode | retainStmtNode | releaseStmtNode | ifStmtNode |
caseStmtNode | loopStmtNode | whileStmtNode | repeatStmtNode | forStmtNode |
readStmtNode | readNewStmtNode | writeStmtNode | writeFmtStmtNode | nopStmtNode
;
assignStmtNode :=
'(' ASSIGN tgtDesigNode exprNode ')'
;
copyStmtNode :=
'(' COPY tgtDesigNode srcDesigNode ')'
;
procCallNode :=
'(' PCALL desigNode argsNode ')'
;
argsNode := exprListNode | emptyNode ;
returnStmtNode :=
'(' RETURN exprNode ')'
;
newStmtNode :=
'(' NEW desigNode ')'
;
newArgStmtNode :=
'(' NEWARG desigNode srcDesigNode ')'
;
newCapStmtNode :=
'(' NEWCAP desigNode capacityNode ')'
;
alias capacityNode = exprNode ;
retainStmtNode :=
'(' RETAIN desigNode ')'
;
releaseStmtNode :=
'(' RELEASE desigNode ')'
;
ifStmtNode :=
'(' IF exprNode stmtSeqNode elsifSeqNode elseStmtNode ')'
;
alias elseStmtNode = stmtSeqNode ;
elsifSeqNode :=
'(' ELSIFSEQ elsifNode+ ')'
;
elsifNode :=
'(' ELSIF exprNode stmtSeqNode ')'
;
caseStmtNode :=
'(' SWITCH caseListNode+ ')'
;
loopStmtNode :=
'(' LOOP stmtSeqNode ')'
;
whileStmtNode :=
'(' WHILE exprNode stmtSeqNode ')'
;
repeatStmtNode :=
'(' REPEAT stmtSeqNode exprNode ')'
;
forStmtNode :=
'(' FOR loopVariantNode iterableNode stmtSeqNode ')'
;
exitStmtNode :=
'(' EXIT ')'
;
readStmtNode :=
'(' READ chanNode desigNode ')'
;
chanNode := identNode | qualidentNode ;
readNewStmtNode :=
'(' READNEW chanNode ptrDesigNode ')'
;
alias ptrDesigNode = desigNode ;
writeStmtNode :=
'(' WRITE chanNode desigNode ')'
;
writeFmtStmtNode :=
'(' WRITEF chanNode fmtNode desigNode ')'
;
nopStmtNode :=
'(' NOP ')'
;
exprNode :=
eqNode | neqNode | ltNode | lteqNode | gtNode | gteqNode | idtyNode | inNode |
plusNode | minusNode | neqNode | concatNode | setDiffNode | orNode | starNode |
slashNode | divNode | modNode | andNode | notNode | typeConvNode | subscrNode |
derefNode | selectNode | funcCall
;
eqNode :=
'(' EQ leftNode rightNode ')'
;
alias leftNode, rightNode = exprNode ;
neqNode :=
'(' NEQ leftNode rightNode ')'
;
ltNode :=
'(' LT leftNode rightNode ')'
;
lteqNode :=
'(' LTEQ leftNode rightNode ')'
;
gtNode :=
'(' GT leftNode rightNode ')'
;
gteqNode :=
'(' GTEQ leftNode rightNode ')'
;
idtyNode :=
'(' IDTY leftNode rightNode ')'
;
inNode :=
'(' IN elemNode setNode ')'
;
alias elemNode, setNode = exprNode ;
plusNode :=
'(' '+' leftNode rightNode ')'
;
minusNode :=
'(' '-' leftNode rightNode ')'
;
negNode :=
'(' NEG exprNode ')'
;
plusNode :=
'(' '+' leftNode rightNode ')'
;
concatNode :=
'(' CONCAT leftNode rightNode ')'
;
setDiffNode :=
'(' SETDIFF leftNode rightNode ')'
;
orNode :=
'(' OR leftNode rightNode ')'
;
starNode :=
'(' '*' leftNode rightNode ')'
;
slashNode :=
'(' '/' leftNode rightNode ')'
;
divNode :=
'(' DIV leftNode rightNode ')'
;
modNode :=
'(' MOD leftNode rightNode ')'
;
andNode :=
'(' AND leftNode rightNode ')'
;
notNode :=
'(' NOT exprNode ')'
;
typeConvNode :=
'(' TYPECONV exprNode typeIdentNode ')'
;
subscrNode :=
'(' SUBSCR desigNode indexNode ')'
;
alias indexNode = exprNode ;
derefNode :=
'(' DEREF exprNode ')'
;
selectNode :=
'(' SELECT desigNode desigNode ')'
;
funcCallNode :=
'(' FCALL desigNode argsNode ')'
;
insertDesigNode :=
'(' INSERT desigNode indexNode ')'
;
alias indexNode = exprNode ;
sliceDesigNode :=
'(' SLICE desigNode rangeNode ')'
;
emptyNode :=
'( EMPTY ')'
;
filenameNode :=
'(' FILENAME '"' Filename '"' ')'
;
Filename := Basename '.' FileSuffix ;
Basename := Letter ( Letter | Digit )* ;
FileSuffix := 'def' | 'ifm' | 'mod' ;
moduleKeyNode :=
'(' KEY Base16IntValue ')'
;
Base16IntValue := '0x' Base16Digit+ ;
impListNode :=
'(' IMPORT QuotedLibIdent+ ')'
;
QuotedLibIdent := '"' Letter ( Letter | Digit )* '"' ;
rxpListNode :=
'(' RE-EXPORT QuotedLibIdent+ ')'
;
constBindSpecNode :=
'(' IDENT ConstBindTarget ')'
;
ConstBindTarget := "COLLATION" | "TLIMIT" ;
procBindSpecNode :=
'(' IDENT ProcBindTarget ')'
;
ProcBindTarget :=
"NEW" | "NEWARG" | "NEWCAP" | "RETAIN" | "RELEASE" | "READ" | "READNEW" |
"WRITE" | "WRITEF" | "ALLOC" | "APPEND" | "ATINSERT" | "ATREMOVE" |
"ATSTORE" | "ATVALUE" | "COUNT" | "DEALLOC" | "FIRST" | "LAST" | "LENGTH" |
"NEXT" | "PREV" | "REMOVE" | "STDIN" | "STDOUT" | "STORE" | "VALUE"
;
identNode :=
'(' IDENT IdentLexeme ')'
;
IdentLexeme := '"' Letter ( Letter | Digit )* '"' ;
qualidentNode :=
'(' QUALIDENT IdentLexeme+ ')'
;
identListNode :=
'(' IDENT-LIST IdentLexeme+ ')'
;
intValNode :=
'(' INTVAL IntValue ')'
;
IntValue := Base16IntValue | NonZeroDigit Digit* ;
realValNode :=
'(' IREALVAL realValue ')'
;
realValue := ( NonZeroDigit+ | '0' ) '.' Digit+ ( 'e' Digit+ )? ;
charValueNode :=
'(' CHRVAL chrValue ')'
;
chrValue := '0u' ( Digit | 'A' .. 'F' )+ ;
quotedValueNode :=
'(' QUOTEDVAL quotedValue ')'
;
quotedValue := '"' ( PrintableChar | EscapeSeq )* '"' ;
PrintableChar := 0u20 .. 0u7F ;
EscapeSeq := '\' ('n' | 't' | '\') ;
Copyright (C) 2023 Modula-2 Software Foundation