GCC Code Coverage Report


Directory: src/
File: src/frontend/parser.cpp
Date: 2025-10-15 09:43:47
Exec Total Coverage
Lines: 32 33 97.0%
Functions: 2 2 100.0%
Branches: 1 2 50.0%

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