Skip to content

Abstract Syntax Tree

Benjamin Kowarsch edited this page Sep 24, 2020 · 46 revisions

S-Expression Grammar

Compilation Unit

compilationUnit :=
  '(' COMPUNIT filenameNode timestampNode digestNode moduleNode ')'
  ;

Generic Sample

(COMPUNIT
  (FILENAME ...)
  (COMPILED ...)
  (DIGEST ...)
  (DEFMOD ...))

Filename Node

filenameNode :=
  '(' FILENAME quotedLiteral ')'
  ;

Sample

(FILENAME "Foobar.def")

Timestamp Node

timestampNode :=
  '(' COMPILED quotedLiteral ')'
  ;

Sample

(COMPILED "202009242016000+900")

Digest Node

digestNode :=
  '(' DIGEST quotedLiteral ')'
  ;

Sample

(DIGEST "9E107D9D372BB6826BD81D3542A419D6")

Module Node

moduleNode :=
  defModNode | impModNode | progNode
  ;

Definition Module

defModNode :=
  '(' DEFMOD idNode importNode* reExportNode* declarationNode* ')'
  ;

Generic Sample

(DEFMOD (ID "Foobar")
  (IMPORT ...)
  (REEXPORT ...)
  (CONST ...)
  (VAR ...)
  (TYPE ...)
  (PROC ...)
  (BIND ...))

Identifier Node

idNode :=
  '(' ID quotedLiteral ')'
  ;

Sample

(ID "Foobar")

Import Node

importNode :=
  '(' IMPORT quotedLiteral+ ')'
  ;

Sample

IMPORT Foo, Bar, Baz;

compiles to

(IMPORT "Foo" "Bar" "Baz")

Re-Export Node

reExportNode :=
  '(' REEXPORT quotedLiteral+ ')'
  ;

Sample

IMPORT Foo+, Bar+;

compiles to

(IMPORT "Foo" "Bar")
(REEXPORT "Foo" "Bar")

Declaration Node

declarationNode :=
  constDeclNode | varDeclNode | typeDeclNode | procDeclNode
  ;

Constant Declaration Node

constDeclNode :=
  '(' CONST idNode exprNode typeIdNode? ')'
  ;
alias typeIdNode = idNode ;

Samples

CONST Foo = 42;
CONST Bar : INTEGER = -1;

compiles to

(CONST (ID "Foo") (EXPR (NUM 42)))
(CONST (ID "Bar") (EXPR (NEG (NUM 1))) (ID "INTEGER"))

Variable Declaration Node

varDeclNode :=
  '(' VAR idListNode typeIdNode ')'
  ;

Samples

VAR foo : Foo;
VAR i, j : INTEGER;

compiles to

(VAR (ID "foo") (ID "Foo"))
(VAR (ID "i" "j") (ID "INTEGER"))

Identifier List Node

idListNode :=
  '(' ID quotedLiteral+ ')'
  ;

Sample

(ID "foo" "bar" "baz")

Type Declaration Node

typeDeclNode :=
  '(' TYPE idNode typeConstructorNode ')'
  ;
typeConstructorNode :=
  aliasTypeNode | derivedTypeNode | subrangeTypeNode |enumTypeNode |
  setTypeNode | arrayTypeNode | recordTypeNode | pointerTypeNode |
  opaqueTypeNode | procTypeNode
  ;

Generic Sample

(TYPE (ID "TypeIdent") ...)

Alias Type Node

aliasTypeNode :=
  '(' ALIAS baseTypeNode ')'
  ;
alias baseTypeNode = typeIdNode ;

Sample

TYPE Foo = ALIAS OF Bar;

compiles to

(TYPE (ID "Foo") (ALIAS (ID "Bar)))

Derived Type Node

alias derivedTypeNode = typeIdNode ;

Sample

TYPE Foo = Bar;

compiles to

(TYPE (ID "Foo") (ID "Bar))

Clone this wiki locally