diff --git a/executable_semantics/main.cpp b/executable_semantics/main.cpp index 84ad6a9c40bd..759844d09e1f 100644 --- a/executable_semantics/main.cpp +++ b/executable_semantics/main.cpp @@ -6,12 +6,12 @@ #include #include +#include "executable_semantics/syntax/parser.h" #include "executable_semantics/syntax/syntax_helpers.h" #include "executable_semantics/tracing_flag.h" #include "llvm/Support/CommandLine.h" extern FILE* yyin; -extern auto yyparse() -> int; // NOLINT(readability-identifier-naming) int main(int argc, char* argv[]) { // yydebug = 1; @@ -34,5 +34,22 @@ int main(int argc, char* argv[]) { if (quiet_option) { Carbon::tracing_output = false; } - return yyparse(); + + // No AST yet + std::optional parsedInput = std::nullopt; + + // Parse and handle syntax errors + auto syntaxErrorCode = yyparse(parsedInput); + if (syntaxErrorCode != 0) { + return syntaxErrorCode; + } + + if (parsedInput == std::nullopt) { + std::cerr << "Internal error: parser validated syntax yet didn't produce " + "an AST.\n"; + return 1; + } + + // Typecheck and run the parsed program. + Carbon::ExecProgram(*parsedInput); } diff --git a/executable_semantics/syntax/parser.ypp b/executable_semantics/syntax/parser.ypp index 5f8a0105e86c..6c5d4efa6b0f 100644 --- a/executable_semantics/syntax/parser.ypp +++ b/executable_semantics/syntax/parser.ypp @@ -14,21 +14,30 @@ } %code requires { +#include + #include "executable_semantics/ast/declaration.h" #include "executable_semantics/ast/field_list.h" #include "executable_semantics/ast/function_definition.h" + +namespace Carbon { +// A representation of the parsed program. +using AST = std::list*; +} + } %code { extern int yylineno; extern int yylex(); -void yyerror(char* error) { +void yyerror(std::optional const& parsedProgram, char* error) { Carbon::PrintSyntaxError(error, yylineno); } -// void yyerror(char* error, ...); } +%parse-param {std::optional& parsedProgram} + %union { char* str; int num; @@ -109,7 +118,7 @@ void yyerror(char* error) { %locations %% input: declaration_list - { Carbon::ExecProgram($1); } + { parsedProgram = $1; } ; pattern: expression diff --git a/executable_semantics/testdata/undef2.golden b/executable_semantics/testdata/undef2.golden index 5d2dd4058a0c..1dd693f38c26 100644 --- a/executable_semantics/testdata/undef2.golden +++ b/executable_semantics/testdata/undef2.golden @@ -1,4 +1,2 @@ -********** source program ********** -********** type checking ********** -error, program must contain a function named `main` +executable_semantics/testdata/undef2.6c:7: syntax error EXIT CODE: 255