Rework grammar to support input files without a newline in the end

This commit is contained in:
Nikita Lisitsa 2026-03-18 19:03:31 +03:00
parent ae01f53d15
commit 29c936c19c

View file

@ -163,6 +163,7 @@ template <typename T>
%precedence lbracket
%type <indented_statement_list> indented_statement_list
%type <indented_statement> statement_line
%type <std::size_t> indentation
%type <ast::statement> statement
%type <std::vector<ast::function_declaration::argument>> function_declaration_argument_list
@ -189,9 +190,18 @@ module
;
indented_statement_list
: indented_statement_list indentation statement optional_comment newline { auto tmp = $1; tmp.statements.push_back({$2, std::make_unique<ast::statement>($3)}); $$ = std::move(tmp); }
| indented_statement_list indentation optional_comment newline { $$ = $1; }
| %empty { $$ = {}; }
: statement_line { indented_statement_list tmp; tmp.statements.push_back(std::move($1)); $$ = std::move(tmp); }
| empty_line { $$ = {}; }
| indented_statement_list newline statement_line { auto tmp = $1; tmp.statements.push_back(std::move($3)); $$ = std::move(tmp); }
| indented_statement_list newline empty_line { $$ = $1; }
;
statement_line
: indentation statement optional_comment { $$ = indented_statement{$1, std::make_unique<ast::statement>($2)}; }
;
empty_line
: indentation optional_comment
;
indentation