Skip to content

0.2.0 Grammar

Robert Durst edited this page Apr 2, 2019 · 47 revisions
PRODUCTION SEMANTIC RULES
Program → Source Program.node = Source.node
Source → Import Source | SourcePart Source.syn = new Node("SOURCE", Import.syn, SourcePart.syn)
Import → ['Import' ImportInfo ]+ Import.syn = List(ImportInfo.syn)
ImportInfo → UDTName ':' UDTName ImportInfo.syn = new Node("IMPORT", UDTName.syn, Location.syn)
UDTName → Identifier UDTName.syn = Identifier.syn
Location → Identifier Location.syn = Identifier.syn
SourcePart → UDT SourcePart.syn = UDT.syn
SourcePart → Script SourcePart.syn = Script.syn
UDT → UserDefinedType UDT.syn = UserDefinedType.syn
UserDefinedType → Attributes Methods UserDefinedType.syn = new Node("UDT", Attributes.syn, Methods.syn)
Attributes → 'Uat' '{' Variable* '}' Attributes.syn = List(Variable.syn)
Methods → 'Ufn' '{' FunctionDefinition* '}' Methods.syn = List(FunctionDefinition.syn)
Script → Script_ Script.syn = new Node("SCRIPT", Script_.syn_fund, Script_.syn_start)
Script_ → FunctionDefinition* Script_ Script_.syn_fund = List(FunctionDefinition.syn)
Script_ → Start Script.syn_start = Start.syn
FunctionDefinition → '(' 'fun' Identifier FunctionInfo ')' FunctionDefinition.syn = new Node("FUNCTION_DEFINITION", Identifier.syn, FunctionInfo.syn)
FunctionInfo → FunctionInOut Block FunctionInfo.syn = new Node(FUNCTION_INFO", FunctionInOut.syn, Block.syn)
FunctionInOut → FunctionInputs FunctionOutputs* FunctionInOut.syn = new Node("FUNCTION_IN_OUT", FunctionInputs.syn, FunctionOut.syn)
FunctionInputs → '(' Variable [',' Variable]* ')' FunctionInputs.syn = List(Variable.syn)
FunctionOutput → '(' Type ')' FunctionOut.syn = Type.syn
Start → 'start' Block Start.syn = Block.syn
Block → '{' Statement* '}' Block.syn = List(Statement.syn)
Statement → Tree Statement.syn = Tree.syn
Statement → Return Statement.syn = Return.syn
Statement → E0 Statement.syn = E0.syn
Tree → '(' Branch* ')' Tree.syn = List(Branch.syn)
Branch → '(' Grouping Block ')' Branch.syn = new Node("BRANCH", Grouping.syn, Block.syn)
Grouping → '|' T E0 '|'
Return → 'return' T Return.syn = T.syn
E0 → TE1
E1 → ['**'] T E0 | E2
E2 → ['*'|'/'|'%'] T E0 | E3
E3 → ['+'|'-'] T E0 | E4
E4 → ['<'|'>'|'<='|'>='] T E0 | E5
E5 → ['=='|'!='] T E0 | E6
E6 → ['and'|'or'] T E0 | E7
E7 → ['='] T E0 | E8
E8 → ['!']* T* E0 | E9
E9Identifier MemberAccess E0 | E10
E10new NewExpression | ε
T → Primary T.syn = Primary.syn
T → '(' E0 ')'
Primary → Boolean Primary.syn = Boolean.syn
Primary → Number Primary.syn = Number.syn
Primary → String Primary.syn = String.syn
Primary → Identifier Primary.syn = Identifier.syn
Boolean → true | false Boolean.syn = boolean.lexval
Number → Integer Number.syn = Integer.syn
Number → Float Number.syn = Float.syn
Integer → [0-9]+ Integer.syn = integer.lexval
Float → [0-9]+'.'[0-9]+ Float.syn = float.lexval
String → '"' [^\"]* '"' String.syn = string.lexval
Identifier → [a-ZA-Z][a-ZA-Z0-9_]* Identifier.syn = identifier.lexval
Clone this wiki locally