Skip to content

Abstract Syntax Tree

Benjamin Kowarsch edited this page Jun 12, 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 ')'
  ;

Type Declaration Node

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

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 | Digit+ ;

Empty Node

emptyNode := '( EMPTY ')' ;

Constant Binding Node

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

Constant Binding Specifier Node

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

ConstBindTarget := "COLLATION" | "TLIMIT" ;

Procedure Binding Node

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

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 ')'
  ;

Clone this wiki locally