diff options
Diffstat (limited to 'boot')
| -rw-r--r-- | boot/lexer.ll | 15 | ||||
| -rw-r--r-- | boot/parser.yy | 6 |
2 files changed, 20 insertions, 1 deletions
diff --git a/boot/lexer.ll b/boot/lexer.ll index e8dde7c..89eb4ed 100644 --- a/boot/lexer.ll +++ b/boot/lexer.ll @@ -55,6 +55,10 @@ EXPONENT [eE][+-]?[[:digit:]]+ %% %{ + if (driver.finished) + { + return yy::parser::make_YYEOF(this->location); + } this->location.step(); %} @@ -65,8 +69,17 @@ EXPONENT [eE][+-]?[[:digit:]]+ \n+ { this->location.step(); } + <<EOF>> { + driver.add_error<syntax_error>("Unterminated comment", this->comment_start); + BEGIN(INITIAL); + + return yy::parser::make_YYEOF(this->location); + } +} +\(\* { + this->comment_start = this->location; + BEGIN(IN_COMMENT); } -\(\* BEGIN(IN_COMMENT); [ \t\r] { this->location.step(); } diff --git a/boot/parser.yy b/boot/parser.yy index cc0a46c..f97d545 100644 --- a/boot/parser.yy +++ b/boot/parser.yy @@ -45,6 +45,8 @@ along with GCC; see the file COPYING3. If not see { public: yy::location location; + /// Where the comment being scanned was opened. + yy::location comment_start; lexer(std::istream& arg_yyin) : yyFlexLexer(&arg_yyin) @@ -167,12 +169,16 @@ along with GCC; see the file COPYING3. If not see program: import_part type_part variable_part procedure_part "end" "." { + driver.finished = true; + boot::unit *tree = new boot::unit(boot::make_position(@$), $1, $2, $3, $4); driver.tree.reset(tree); } | import_part type_part variable_part procedure_part "program" "(" optional_identifiers ")" procedure_body "end" "." { + driver.finished = true; + boot::unit *tree = new boot::unit(boot::make_position(@$), $1, $2, $3, $4, std::move($7), boot::make_position(@5), std::move(*$9)); driver.tree.reset(tree); |
