-
Notifications
You must be signed in to change notification settings - Fork 2
Abstract Syntax Tree
Benjamin Kowarsch edited this page Sep 24, 2020
·
46 revisions
compilationUnit :=
'(' COMPUNIT filenameNode timestampNode digestNode moduleNode ')'
;(COMPUNIT
(FILENAME ...)
(COMPILED ...)
(DIGEST ...)
(DEFMOD ...))
filenameNode :=
'(' FILENAME quotedLiteral ')'
;(FILENAME "Foobar.def")
timestampNode :=
'(' COMPILED quotedLiteral ')'
;(COMPILED "202009242016000+900")
digestNode :=
'(' DIGEST quotedLiteral ')'
;(DIGEST "9E107D9D372BB6826BD81D3542A419D6")
moduleNode :=
defModNode | impModNode | progNode
;defModNode :=
'(' DEFMOD idNode importNode* reExportNode* declarationNode* ')'
;(DEFMOD (ID "Foobar")
(IMPORT ...)
(REEXPORT ...)
(CONST ...)
(VAR ...)
(TYPE ...)
(PROC ...)
(BIND ...))
idNode :=
'(' ID quotedLiteral ')'
;(ID "Foobar")
importNode :=
'(' IMPORT quotedLiteral+ ')'
;IMPORT Foo, Bar, Baz;(IMPORT "Foo" "Bar" "Baz")
reExportNode :=
'(' REEXPORT quotedLiteral+ ')'
;IMPORT Foo+, Bar+;(IMPORT "Foo" "Bar")
(REEXPORT "Foo" "Bar")
declarationNode :=
constDeclNode | varDeclNode | typeDeclNode | procDeclNode
;constDeclNode :=
'(' CONST idNode exprNode typeIdNode? ')'
;
alias typeIdNode = idNode ;CONST Foo = 42;
CONST Bar : INTEGER = -1;(CONST (ID "Foo") (EXPR (NUM 42)))
(CONST (ID "Bar") (EXPR (NEG (NUM 1))) (ID "INTEGER"))
varDeclNode :=
'(' VAR idListNode typeIdNode ')'
;VAR foo : Foo;
VAR i, j : INTEGER;(VAR (ID "foo") (ID "Foo"))
(VAR (ID "i" "j") (ID "INTEGER"))
idListNode :=
'(' ID quotedLiteral+ ')'
;(ID "foo" "bar" "baz")
typeDeclNode :=
'(' TYPE idNode typeConstructorNode ')'
;
typeConstructorNode :=
aliasTypeNode | derivedTypeNode | subrangeTypeNode |enumTypeNode |
setTypeNode | arrayTypeNode | recordTypeNode | pointerTypeNode |
opaqueTypeNode | procTypeNode
;(TYPE (ID "TypeIdent") ...)
aliasTypeNode :=
'(' ALIAS baseTypeNode ')'
;
alias baseTypeNode = typeIdNode ;TYPE Foo = ALIAS OF Bar;(TYPE (ID "Foo") (ALIAS (ID "Bar)))
alias derivedTypeNode = typeIdNode ;TYPE Foo = Bar;(TYPE (ID "Foo") (ID "Bar))
subrangeTypeNode :=
'(' SUBR baseTypeNode lowerBound upperBound ')'
;
alias lowerBound, upperBound = exprNode ;TYPE Hour = [0..23] OF INTEGER;(TYPE (ID "Hour") (ID "INTEGER") (SUBR (EXPR (NUM 0))(EXPR (NUM 23))))
enumTypeNode :=
'(' ENUM valueListNode baseTypeNode? ')'
;
alias valueListNode = idListNode ;TYPE Colour = ( Red, Green, Blue );
TYPE MoreColour = ( +Colour, Orange, Magenta );(TYPE (ID "Colour") (ENUM (ID "Red" "Green" "Blue")))
(TYPE (ID "MoreColour") (ENUM (ID "Orange" "Magenta") (ID "Colour")))
setTypeNode :=
'(' SET enumTypeIdNode ')'
;
alias enumTypeIdNode = typeIdNode ;TYPE ColourSet = SET OF Colour;(TYPE (ID "ColourSet") (SET (ID "Colour")))
arrayTypeNode :=
'(' ARRAY capacity baseTypeNode ')'
;
alias capacity = exprNode ;TYPE Str80 = ARRAY 80 OF CHAR;(TYPE (ID "Str80") (ARRAY (EXPR (NUM 80)) (ID "Colour")))
Copyright © 2015-2018 Modula-2 Software Foundation