Skip to content

Abstract Syntax Tree

Benjamin Kowarsch edited this page Jun 13, 2023 · 35 revisions

AST Specification

File Node

fileNode :=
  '(' FILE filenameNode moduleKeyNode moduleNode ')'
  ;

Filename Node

filenameNode :=
  '(' FILENAME '"' Filename '"' ')'
  ;

Filename := Basename '.' FileSuffix ;

Basename := Letter ( Letter | Digit )* ;

FileSuffix := 'def' | 'ifm' | 'mod' ;

Module Key Node

moduleKeyNode :=
  '(' KEY Base16IntValue ')'
  ;

Base16IntValue := '0x' Base16Digit+ ;

Module Nodes

moduleNode :=
  ifcModuleNode | impModuleNode | pgmModuleNode ;

Interface Module Node

ifcModuleNode :=
  '(' INTERFACE moduleIdentNode impListNode rxpListNode declListNode ')'
  ;

alias moduleIdentNode = identNode ;

Implementation Module Node

impModuleNode :=
  '(' IMPLEMENTATION moduleIdentNode impListNode defListNode blockNode ')'
  ;

Program Module Node

pgmModuleNode :=
  '(' PROGRAM moduleIdentNode impListNode defListNode blockNode ')'
  ;

Import Node

impListNode :=
  '(' IMPORT QuotedLibIdent+ ')'
  ;

QuotedLibIdent := '"' Letter ( Letter | Digit )* '"' ;

Re-Export List Node

rxpListNode :=
  '(' RE-EXPORT QuotedLibIdent+ ')'
  ;

Declaration List Node

declListNode :=
  '(' DECL-LIST defOrDeclNode+ ')'
  ;

Definition Or Declaration Node

defOrDeclNode :=
  constDefListNode | typeDefListNode |
  typeDeclListNode| varDeclListNode | procDeclListNode ;

Definition List Node

defListNode :=
  '(' DEF-LIST defNode+ ')'
  ;

Definition Node

defNode :=
  constDefNode | typeDefNode | varDefNode | procDefNode
  ;

Constant Definition Node

constDefNode :=
  '(' CONSTDEF identNode ( typeIdentNode | emptyNode ) exprNode ')'
  ;

alias typeIdentNode = identNode ;

Type Declaration Node

typeDeclNode :=
  '(' OPAQUE identNode ( allocSizeNode | emptyNode ) ')'
  ;

alias allocSizeNode = intValueNode ;

Type Definition Node

typeDefNode :=
  '(' TYPEDEF identNode typeNode ')'
  ;

Variable Declaration Node

varDeclNode :=
  '(' VARDECL identNode typeNode ')'
  ;

Variable Definition Node

varDefNode :=
  '(' VARDEF identNode typeNode ')'
  ;

Procedure Declaration Node

procDeclNode :=
  '(' PROCDECL procSigNode ')'
  ;

Procedure Definition Node

procDefNode :=
  '(' PROCDEF procSigNode blockNode ')'
  ;

Identifier Node

identNode :=
  '(' IDENT IdentLexeme ')'
  ;

IdentLexeme := '"' Letter ( Letter | Digit )* '"' ;

Integer Value Node

intValNode :=
  '(' INTVAL IntValue ')'
  ;

IntValue := Base16IntValue | NonZeroDigit Digit* ;

Empty Node

emptyNode := '( EMPTY ')' ;

Constant Binding Node

constBindNode :=
  '(' BIND-CONST constIdentNode constBindSpecNode ')'
  ;

alias constIdentNode = identNode ;

Constant Binding Specifier Node

constBindSpecNode :=
  '(' IDENT ConstBindTarget ')'
  ;

ConstBindTarget := "COLLATION" | "TLIMIT" ;

Procedure Binding Node

procBindNode :=
  '(' BIND-PROC procIdentNode procBindSpecNode ')'
  ;

alias procIdentNode identNode ;

Procedure Binding Specifier Node

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"
  ;

Procedure Signature Node

procSigNode :=
  '(' PSIG identNode paramListNode retTypeNode ')'
  ;

alias retTypeNode = typeIdentNode ;

Alias Type Node

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

alias baseTypeNode = typeIdentNode ;

Subrange Type Node

subrangeTypeNode :=
  '(' SUBR baseTypeNode rangeNode ')'
  ;

Range Node

rangeNode :=
  '(' RANGE lowerBound upperBound ')'
  ;

alias lowerBound, upperBound = exprNode ;

Enumeration Type Node

enumTypeNode :=
  '(' ( baseTypeNode | emptyNode ) enumValueListNode ')'
  ;

alias enumValueListNode = identListNode ;

Identifier List Node

identListNode :=
  '(' IDENT-LIST IdentLexeme+ ')'
  ;

Set Type Node

setTypeNode :=
  '(' SET baseTypeNode ')'
  ;

Array Type Node

arrayTypeNode :=
  '(' ARRAY baseTypeNode capacityNode ')'
  ;

alias capacityNode = intValueNode ;

Record Type Node

recordTypeNode :=
  '(' RECORD ( baseTypeNode | emptyNode ) fieldListSeqNode ')'
  ;

Field List Sequence Node

fieldListSeqNode :=
  '(' FIELD-LIST-SEQ fieldListNode+ ')'
  ;

alias fieldListNode = varDefNode ;

Pointer Type Node

pointerTypeNode :=
  '(' POINTER targetTypeNode ')'
  ;

alias targetTypeNode = qualidentNode ;

Qualified Identifier Node

qualidentNode :=
  '(' QUALIDENT IdentLexeme+ ')'
  ;

Opaque Type Node

opaqueTypeNode :=
  '(' OPAQUE ( allocSizeNode | emptyNode ) ')'
  ;

alias allocSizeNode = exprNode ;

Procedure Type Node

procTypeNode :=
  '(' PROC-TYPE formalTypeListNode retTypeNode ')'
  ;
Clone this wiki locally