-
Notifications
You must be signed in to change notification settings - Fork 0
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 |
E1 → E2 | E1.syn = E2.syn E2.inh = E1.inh |
E2 → ['*'|'/'|'%'] T2 E0 | E2.syn = new Node(["*"|"/"|"%"], E2.inh, E3.inh) E3.inh = T2.syn |
E2 → E3 | E2.syn = E3.syn E3.inh = E2.inh |
E3 → ['+'|'-'] T3 E0 | E3.syn = new Node(["+"|"-"], E3.inh, E4.inh) E4.inh = T3.syn |
E3 → E4 | E3.syn = E4.syn E4.inh = E3.inh |
E4 → ['<'|'>'|'<='|'>='] T4 E0 | E4.syn = new Node(["<"|">*"|"<="|">="], E5.inh) E5.inh = T4.syn |
E4 → E5 | E4.syn = E5.syn E5.inh = E4.inh |
E5 → ['=='|'!='] T5 E0 | E5.syn = new Node(["=="|"!="], E5.inh, E6.inh) E6.inh = T5.syn |
E5 → E6 | 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 |
E6 → E7 | E6.syn = E7.syn E7.inh = E6.inh |
E7 → ['='] T7 E0 | E7.syn = new Node(["="], E8.inh, E7.inh) E8.inh = T7.syn |
E7 → E8 | E7.syn = E8.syn E8.inh = E7.inh |
E8 → ['!', '++','--,] T8 E0 | E8.syn = new Node(["!","++","--"], E9.inh) E9.inh = T8.syn |
E8 → E9 | E8.syn = E9.syn E9.inh = E8.inh |
E9 → [+=','-=','*=','/='] T8 E0 | E8.syn = new Node(["<",">","<=",">="], E10.inh) E10.inh = T9.syn |
E9 → E10 | E09.syn = E10.syn E9.inh = E9.inh |
E10 → MemberAccess E0 | E10.syn = MemberAccess.syn MemberAccess.inh = E10.inh |
E10 → E11 | E10.syn = E11.syn E11.inh = E10.inh |
E11 → new New | E11.syn = new Node("NEW", E11.inh, New.syn) |
E11 → E12 | 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 |