-
Notifications
You must be signed in to change notification settings - Fork 0
Abstract Syntax Tree
Benjamin Kowarsch edited this page Jun 13, 2023
·
35 revisions
fileNode :=
'(' FILE filenameNode moduleKeyNode moduleNode ')'
;
filenameNode :=
'(' FILENAME '"' Filename '"' ')'
;
Filename := Basename '.' FileSuffix ;
Basename := Letter ( Letter | Digit )* ;
FileSuffix := 'def' | 'ifm' | 'mod' ;
moduleKeyNode :=
'(' KEY Base16IntValue ')'
;
Base16IntValue := '0x' Base16Digit+ ;
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 ')'
;
impListNode :=
'(' IMPORT QuotedLibIdent+ ')'
;
QuotedLibIdent := '"' Letter ( Letter | Digit )* '"' ;
rxpListNode :=
'(' RE-EXPORT QuotedLibIdent+ ')'
;
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 :=
'(' OPAQUE identNode ( allocSizeNode | emptyNode ) ')'
;
alias allocSizeNode = intValueNode ;
typeDefNode :=
'(' TYPEDEF identNode typeNode ')'
;
varDeclNode :=
'(' VARDECL identNode typeNode ')'
;
varDefNode :=
'(' VARDEF identNode typeNode ')'
;
procDeclNode :=
'(' PROCDECL procSigNode ')'
;
procDefNode :=
'(' PROCDEF procSigNode blockNode ')'
;
identNode :=
'(' IDENT IdentLexeme ')'
;
IdentLexeme := '"' Letter ( Letter | Digit )* '"' ;
intValNode :=
'(' INTVAL IntValue ')'
;
IntValue := Base16IntValue | NonZeroDigit Digit* ;
emptyNode := '( EMPTY ')' ;
constBindNode :=
'(' BIND-CONST constIdentNode constBindSpecNode ')'
;
alias constIdentNode = identNode ;
constBindSpecNode :=
'(' IDENT ConstBindTarget ')'
;
ConstBindTarget := "COLLATION" | "TLIMIT" ;
procBindNode :=
'(' BIND-PROC procIdentNode procBindSpecNode ')'
;
alias procIdentNode identNode ;
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"
;
procSigNode :=
'(' PSIG identNode paramListNode retTypeNode ')'
;
alias retTypeNode = typeIdentNode ;
aliasTypeNode :=
'(' ALIAS baseTypeNode ')'
;
alias baseTypeNode = typeIdentNode ;
subrangeTypeNode :=
'(' SUBR baseTypeNode rangeNode ')'
;
rangeNode :=
'(' RANGE lowerBound upperBound ')'
;
alias lowerBound, upperBound = exprNode ;
enumTypeNode :=
'(' ( baseTypeNode | emptyNode ) enumValueListNode ')'
;
alias enumValueListNode = identListNode ;
identListNode :=
'(' IDENT-LIST IdentLexeme+ ')'
;
setTypeNode :=
'(' SET baseTypeNode ')'
;
arrayTypeNode :=
'(' ARRAY baseTypeNode capacityNode ')'
;
alias capacityNode = intValueNode ;
recordTypeNode :=
'(' RECORD ( baseTypeNode | emptyNode ) fieldListSeqNode ')'
;
fieldListSeqNode :=
'(' FIELD-LIST-SEQ fieldListNode+ ')'
;
alias fieldListNode = varDefNode ;
pointerTypeNode :=
'(' POINTER targetTypeNode ')'
;
alias targetTypeNode = qualidentNode ;
qualidentNode :=
'(' QUALIDENT IdentLexeme+ ')'
;
opaqueTypeNode :=
'(' OPAQUE ( allocSizeNode | emptyNode ) ')'
;
alias allocSizeNode = exprNode ;
procTypeNode :=
'(' PROC-TYPE formalTypeListNode retTypeNode ')'
;
Copyright (C) 2023 Modula-2 Software Foundation