diff --git a/src/parser/ast.yaml b/src/parser/ast.yaml index 3ade6d2..15aad26 100644 --- a/src/parser/ast.yaml +++ b/src/parser/ast.yaml @@ -311,3 +311,133 @@ Member: on: rule_present - identifier - type_use + +# Statements +Statement: + rules: + - VariableDeclaration + - AssignmentStatement + - ExpressionStatement + - UseStatement + - IfElseStatement + - IfStatementStatement + - WhileStatement + - ForStatement +VariableDeclaration: + children: + - let_kw: + rule: Let + skip: true + - is_mut: + rule: Mut + build: + type: boolean + on: rule_present + - identifier + - type_use: + optional: true + - expression: + optional: true +AssignmentStatement: + children: + - left: + rule: Expression + - right: + rule: Expression +ExpressionStatement: + children: + - expression +IfStatement: + children: + - if_kw: + rule: If + skip: true + - expression + - then_kw: + rule: Then + skip: true + - statements: + rule: Statement + vec: true + - end_kw: + rule: End + skip: true +IfElseStatement: + children: + - if_else_first + - if_else_ifs: + rule: IfElseIf + vec: true + - if_else_else +IfElseFirst: + children: + - if_kw: + rule: If + skip: true + - expression + - then_kw: + rule: Then + skip: true + - statements: + rule: Statement + vec: true +IfElseIf: + children: + - else_kw: + rule: Else + skip: true + - if_kw: + rule: If + skip: true + - expression + - then_kw: + rule: Then + skip: true + - statements: + rule: Statement + vec: true +IfElseElse: + children: + - else_kw: + rule: Else + skip: true + - statements: + rule: Statement + vec: true + - end_kw: + rule: End + skip: true +WhileStatement: + children: + - while_kw: + rule: While + skip: true + - expression + - do_kw: + rule: Do + skip: true + - statements: + rule: Statement + vec: true + - end_kw: + rule: End + skip: true +ForStatement: + children: + - for_kw: + rule: For + skip: true + - identifier + - in_kw: + rule: In + skip: true + - expression + - do_kw: + rule: Do + skip: true + - statement: + rule: Statement + vec: true + - end_kw: + rule: End + vec: true \ No newline at end of file diff --git a/src/parser/deimos.pest b/src/parser/deimos.pest index 2eb147b..8b6a3e1 100644 --- a/src/parser/deimos.pest +++ b/src/parser/deimos.pest @@ -30,6 +30,8 @@ Alias = { "alias" } True = { "true" } False = { "false" } Use = { "use" } +Then = { "then" } +Do = { "do" } End = { "end" } Companion = { "comp" } @@ -535,29 +537,15 @@ Member = { // Statements -BlockStatement = { - "{" - ~ Statement* - ~ Expression? - ~ "}" -} - Statement = { - ( - VariableDeclaration - | AssignmentStatement - | CallStatement - | ReturnStatement - | UseStatement - ) - ~ Semicolon - | ( - BlockStatement - | IfElseStatement - | IfStatement - | WhileStatement - | ForStatement - ) + VariableDeclaration + | AssignmentStatement + | ExpressionStatement + | UseStatement + | IfElseStatement + | IfStatement + | WhileStatement + | ForStatement } VariableDeclaration = { @@ -574,63 +562,61 @@ AssignmentStatement = { ~ Expression } -CallStatement = { - PrimaryExpression - ~ ObjectAccess? - ~ ParenthesesCall - ~ ( - ObjectAccess - | ParenthesesCall - | PlusPlus - | MinusMinus - )* -} - -ReturnStatement = { - Return - ~ Expression? +ExpressionStatement = { + Expression } IfStatement = { If - ~ "(" ~ Expression - ~ ")" - ~ BlockStatement + ~ Then + ~ Statement* + ~ End } IfElseStatement = { - IfStatement - ~ ElseIf* - ~ ElseBlock? + IfElseFirst + ~ IfElseIf* + ~ IfElseElse } -ElseIf = { - Else - ~ IfStatement +IfElseFirst = { + If + ~ Expression + ~ Then + ~ Statement* } -ElseBlock = { +IfElseIf = { Else - ~ BlockStatement + ~ If + ~ Expression + ~ Then + ~ Statement* +} + +IfElseElse = { + Else + ~ Statement* + ~ End } WhileStatement = { While - ~ "(" ~ Expression - ~ ")" - ~ BlockStatement + ~ Do + ~ Statement* + ~ End } ForStatement = { For - ~ "(" ~ Identifier ~ In ~ Expression - ~ ")" - ~ BlockStatement + ~ Do + ~ Statement* + ~ End } // Expressions @@ -740,6 +726,18 @@ ObjectIndex = { // Calls +CallExpression = { + PrimaryExpression + ~ ObjectAccess? + ~ ParenthesesCall + ~ ( + ObjectAccess + | ParenthesesCall + | PlusPlus + | MinusMinus + )* +} + ParenthesesCall = { TurboFish? ~ "("