Add variable definitions, function definitions

edge_only_predecessors
Max Brunsfeld 2014-09-06 18:50:42 +07:00
parent 60c7f98fec
commit c762be696e
2 changed files with 42 additions and 5 deletions

@ -52,14 +52,25 @@ module.exports = compiler.grammar
var_declaration: -> seq(
@type,
commaSep1(@type_expression),
commaSep1(choice(
@type_expression,
@var_assignment)),
";")
function_declaration: -> seq(
@type,
@identifier,
"(", @formal_parameters, ")",
";")
choice(";", @statement_block))
statement_block: -> seq(
"{", err(repeat(@statement)), "}")
statement: -> choice(
@return_statement),
return_statement: -> seq(
keyword("return"), @expression, ";")
type: -> seq(
optional(keyword("const")),
@ -120,13 +131,19 @@ module.exports = compiler.grammar
"{", err(commaSep(@enum_value)), "}")))
enum_value: -> seq(
@identifier, optional(seq("=", @number)))
@identifier, optional(seq("=", @expression)))
field: -> seq(@type, @type_expression)
var_assignment: -> seq(@type_expression, "=", @expression)
type_modifier: -> choice(
keyword("const"))
expression: -> choice(
@number,
@string)
number: -> /\d+(\.\d+)?/
string: -> token(seq(

@ -62,14 +62,17 @@ Primitive-typed variable declarations
============================================
unsigned short int a;
long int b;
long int b, c = 5, d;
float d, e;
---
(program
(var_declaration (primitive_type (identifier)) (identifier))
(var_declaration (primitive_type (identifier)) (identifier))
(var_declaration (primitive_type (identifier))
(identifier)
(var_assignment (identifier) (number))
(identifier))
(var_declaration (identifier) (identifier) (identifier)))
============================================
@ -127,3 +130,20 @@ int main(int argc, const char **argv);
(field (identifier) (identifier))
(field (type (identifier)) (pointer_type (pointer_type (identifier)))))))
============================================
Function definitions
============================================
void do_stuff(int arg1) {
return 5;
}
---
(program (function_declaration
(identifier)
(identifier)
(formal_parameters (field (identifier) (identifier)))
(statement_block
(return_statement (number)))))