| Line | Branch | Exec | Source |
|---|---|---|---|
| 1 | #include <gyoji-frontend.hpp> | ||
| 2 | |||
| 3 | #include <gyoji.l.hpp> | ||
| 4 | #include <gyoji.y.hpp> | ||
| 5 | |||
| 6 | using namespace Gyoji::context; | ||
| 7 | using namespace Gyoji::mir; | ||
| 8 | using namespace Gyoji::frontend; | ||
| 9 | using namespace Gyoji::frontend::ast; | ||
| 10 | using namespace Gyoji::frontend::tree; | ||
| 11 | using namespace Gyoji::frontend::lowering; | ||
| 12 | using namespace Gyoji::frontend::namespaces; | ||
| 13 | using namespace Gyoji::frontend::yacc; | ||
| 14 | |||
| 15 | Gyoji::owned<ParseResult> | ||
| 16 | 242 | Parser::parse( | |
| 17 | Gyoji::context::CompilerContext & _compiler_context, | ||
| 18 | Gyoji::misc::InputSource & _input_source | ||
| 19 | ) | ||
| 20 | { | ||
| 21 | 242 | auto ns2_context = std::make_unique<Gyoji::frontend::namespaces::NS2Context>(); | |
| 22 | Gyoji::owned<ParseResult> result = std::make_unique<ParseResult>( | ||
| 23 | _compiler_context, | ||
| 24 | 242 | std::move(ns2_context) | |
| 25 | 242 | ); | |
| 26 | |||
| 27 | yyscan_t scanner; | ||
| 28 | 242 | yylex_init(&scanner); | |
| 29 | |||
| 30 | LexContext lex_context( | ||
| 31 | 242 | *result->ns2_context, | |
| 32 | _compiler_context, | ||
| 33 | 242 | _input_source); | |
| 34 | 242 | yyset_extra(&lex_context, scanner); | |
| 35 | |||
| 36 | 242 | yacc::YaccParser parser { scanner, *result }; | |
| 37 | 242 | parser.parse(); | |
| 38 | 242 | yylex_destroy(scanner); | |
| 39 | |||
| 40 | 242 | return result; | |
| 41 | 242 | } | |
| 42 | |||
| 43 | Gyoji::owned<MIR> | ||
| 44 | 32 | Parser::parse_to_mir( | |
| 45 | Gyoji::context::CompilerContext & _compiler_context, | ||
| 46 | Gyoji::misc::InputSource & _input_source | ||
| 47 | ) | ||
| 48 | { | ||
| 49 | |||
| 50 | // We don't need to report an error at this point | ||
| 51 | // because lack of a translation unit means | ||
| 52 | // that our caller should not even have called us | ||
| 53 | // and should report a syntax error at the | ||
| 54 | // higher level. | ||
| 55 | 32 | Gyoji::owned<ParseResult> parse_result = parse(_compiler_context, _input_source); | |
| 56 | 32 | Gyoji::owned<MIR> mir = std::make_unique<MIR>(); | |
| 57 | |||
| 58 |
1/2✗ Branch 2 not taken.
✓ Branch 3 taken 32 times.
|
32 | if (!parse_result->has_translation_unit()) { |
| 59 | // It's harmless to return an empty mir | ||
| 60 | // to the next stages | ||
| 61 | ✗ | return mir; | |
| 62 | } | ||
| 63 | |||
| 64 | 32 | Gyoji::mir::operation_static_init(); | |
| 65 | |||
| 66 | 32 | fprintf(stderr, "============================\n"); | |
| 67 | 32 | fprintf(stderr, "Type and symbol table resolution pass\n"); | |
| 68 | 32 | fprintf(stderr, "============================\n"); | |
| 69 | // First, resolve all of the type definitions. | ||
| 70 | // Also at this stage, we resolve the function declarations. | ||
| 71 | TypeResolver type_resolver(_compiler_context, | ||
| 72 | parse_result->get_translation_unit(), | ||
| 73 | 32 | *mir); | |
| 74 | 32 | type_resolver.resolve(); | |
| 75 | |||
| 76 | 32 | fprintf(stderr, "============================\n"); | |
| 77 | 32 | fprintf(stderr, "Function resolution pass\n"); | |
| 78 | 32 | fprintf(stderr, "============================\n"); | |
| 79 | FunctionResolver function_resolver(_compiler_context, | ||
| 80 | 32 | *parse_result, | |
| 81 | 32 | *mir, | |
| 82 | 32 | type_resolver); | |
| 83 | 32 | function_resolver.resolve(); | |
| 84 | |||
| 85 | 32 | return mir; | |
| 86 | 32 | } | |
| 87 |