Skip to content

0.2.0 Grammar

Robert Durst edited this page Apr 21, 2019 · 47 revisions
PRODUCTION SEMANTIC RULES
Program → Source Program.syn = Source.syn
Source → Import Source | SourcePart Source.syn = new Node("SOURCE", Import.syn, SourcePart.syn)
Import → ['Import' ImportInfo ]+ Import.syn = List(ImportInfo.syn)
ImportInfo → UDName ':' Location ImportInfo.syn = new Node("IMPORT", UDName.syn, Location.syn)
UDName → Identifier UDName.syn = Identifier.syn
Location → String 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 → Declaration Statement.syn = Declaration.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 → '|' E0 '|' Grouping.syn = E0.syn
Return → 'return' T Return.syn = T.syn
Declaration → 'dec' Variable = T Declaration.syn = new Node("DEC", Variable.syn, T.syn)
--- ---
E0 → T0E1 E0.syn = E1.syn
E1.inh = T0.syn
E1 → ['**'] T1 E0 E1.syn = new Node(["**"], E1.inh, E2.inh)
E2.inh = T1.syn
E1E2 E1.syn = E2.syn
E2.inh = E1.inh
E2 → ['*'|'/'|'%'] T2 E0 E2.syn = new Node(["*"|"/"|"%"], E2.inh, E3.inh)
E3.inh = T2.syn
E2E3 E2.syn = E3.syn
E3.inh = E2.inh
E3 → ['+'|'-'] T3 E0 E3.syn = new Node(["+"|"-"], E3.inh, E4.inh)
E4.inh = T3.syn
E3E4 E3.syn = E4.syn
E4.inh = E3.inh
E4 → ['<'|'>'|'<='|'>='] T4 E0 E4.syn = new Node(["<"|">*"|"<="|">="], E5.inh)
E5.inh = T4.syn
E4E5 E4.syn = E5.syn
E5.inh = E4.inh
E5 → ['=='|'!='] T5 E0 E5.syn = new Node(["=="|"!="], E5.inh, E6.inh)
E6.inh = T5.syn
E5E6 E5.syn = E6.syn
E6.inh = E5.inh
E6 → ['and'|'or'] T6 E0 E6.syn = new Node(["and"|"or"], E6.inh, E7.inh)
E7.inh = T6.syn
E6E7 E6.syn = E7.syn
E7.inh = E6.inh
E7 → ['='] T7 E0 E7.syn = new Node(["="], E8.inh, E7.inh)
E8.inh = T7.syn
E7E8 E7.syn = E8.syn
E8.inh = E7.inh
E8 → ['!', '++','--,] T8 E0 E8.syn = new Node(["!","++","--"], E9.inh)
E9.inh = T8.syn
E8E9 E8.syn = E9.syn
E9.inh = E8.inh
E9 → [+=','-=','*=','/='] T8 E0 E8.syn = new Node(["<",">","<=",">="], E10.inh)
E10.inh = T9.syn
E9E10 E09.syn = E10.syn
E9.inh = E9.inh
E10MemberAccess E0 E10.syn = MemberAccess.syn
MemberAccess.inh = E10.inh
E10E11 E10.syn = E11.syn
E11.inh = E10.inh
E11new New E11.syn = new Node("NEW", E11.inh, New.syn)
E11E12 E11.syn = E12.syn
E12.inh = E11.inh
E12 → FunctionCall E12.syn = FunctionCall.syn
E12 → T12 E12.syn = T12.syn
--- ---
MemberAccess → AttributeAccess MemberAccess.syn = AttributeAccess.syn
AttributeAccess.inh = MemberAccess.inh
MemberAccess → MethodAccess MemberAccess.syn = MethodAccess.syn
MethodAccess.inh = MemberAccess.inh
AttributeAccess → '.' Identifier AttributeAccess.syn = new Node("ATTRIBUTE_ACCESS", AttributeAccess.inh, Identifier.syn)
MethodAccess → '...' FunctionCall MethodAccess.syn = new Node("MEMBER_ACCESS", MethodAccess.inh, FunctionCall.syn)
FunctionCall → '(' [Identifier [',' Identifier]*] ')' FunctionCall.syn = List(Identifier.syn)
--- ---
New → UDTDec New.syn = UDTDec.syn
UDTDec → '{' [UDTDecItem [',' UDTDecItem]*] '}' UDTDec.syn = List(UDTDecItem.syn)
UDTDecItem → Identifier ':' Primary UDTDecItem.syn = new Node("UDT_DEC_ITEM", Identifier.syn, Primary.syn)
--- ---
T → Primary T.syn = Primary.syn
T → '(' E0 ')' T.syn = E0.syn
Primary → Boolean Primary.syn = Boolean.syn
Primary → Number Primary.syn = Number.syn
Primary → String Primary.syn = String.syn
Primary → Identifier Primary.syn = Identifier.syn
Primary → List Primary.syn = List.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
List →'[' . ']' List.syn = list.lexval
ListType → "[int]" | "[flt]" | "[bool]" | "[str]" lListType.syn = listtype.lexval
Type → Identifier Type.syn = Identifier.syn
Type → ListType Type.syn = ListType.syn
Clone this wiki locally