-
Notifications
You must be signed in to change notification settings - Fork 0
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 | |
| E9 → Identifier MemberAccess E0 | E10 | |
| E10 → new 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 |