diff --git a/grammar.coffee b/grammar.coffee index c2e163a..4e03cec 100644 --- a/grammar.coffee +++ b/grammar.coffee @@ -67,11 +67,15 @@ module.exports = compiler.grammar "{", err(repeat(@statement)), "}") statement: -> choice( - @return_statement), + @return_statement, + @expression_statement), return_statement: -> seq( keyword("return"), @expression, ";") + expression_statement: -> seq( + @expression, ";") + type: -> seq( optional(keyword("const")), choice( @@ -141,9 +145,22 @@ module.exports = compiler.grammar keyword("const")) expression: -> choice( + @identifier, + @function_call, + @field_access, + @deref_field_access, @number, @string) + field_access: -> seq( + @expression, ".", @identifier) + + deref_field_access: -> seq( + @expression, "->", @identifier) + + function_call: -> seq( + @expression, "(", err(commaSep(@expression)), ")") + number: -> /\d+(\.\d+)?/ string: -> token(seq( diff --git a/grammar_test/expressions.txt b/grammar_test/expressions.txt new file mode 100644 index 0000000..7949b16 --- /dev/null +++ b/grammar_test/expressions.txt @@ -0,0 +1,30 @@ +============================================ +Function calls +============================================ + +int main() { + printf("hi! %d\n", x); +} + +--- + +(function_declaration (identifier) (identifier) (formal_parameters) + (statement_block + (expression_statement (function_call (identifier) (string) (identifier))))) + +============================================ +Field access +============================================ + +int main() { + s.data1; + p->data2; +} + +--- + +(function_declaration (identifier) (identifier) (formal_parameters) + (statement_block + (expression_statement (field_access (identifier) (identifier))) + (expression_statement (deref_field_access (identifier) (identifier))))) + diff --git a/grammar_test/statements.txt b/grammar_test/statements.txt new file mode 100644 index 0000000..dacbf3d --- /dev/null +++ b/grammar_test/statements.txt @@ -0,0 +1,17 @@ +============================================ +Expression statements +============================================ + +int main() { + x; +} + +--- + +(function_declaration + (identifier) + (identifier) + (formal_parameters) + (statement_block + (expression_statement (identifier)))) +