• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

rieske / trans / 29700705556

19 Jul 2026 07:29PM UTC coverage: 90.76% (+0.2%) from 90.53%
29700705556

Pull #46

github

rieske
Experimental parser generator optimization
Pull Request #46: Experimental parser generator optimization

485 of 494 new or added lines in 16 files covered. (98.18%)

17 existing lines in 6 files now uncovered.

5275 of 5812 relevant lines covered (90.76%)

352127.06 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

63.41
/src/driver/CompilerComponentsFactory.cpp
1
#include "CompilerComponentsFactory.h"
2

3
#include "ast/AbstractSyntaxTreeBuilder.h"
4
#include "ast/VerboseSyntaxTreeBuilder.h"
5
#include "parser/BNFFileReader.h"
6
#include "parser/FilePersistedParsingTable.h"
7
#include "parser/GeneratedParsingTable.h"
8
#include "parser/LR1Parser.h"
9
#include "parser/ParseTreeBuilder.h"
10
#include "scanner/LexFileScannerReader.h"
11
#include "util/Logger.h"
12
#include "util/LogManager.h"
13
#include "Configuration.h"
14

15
#include "codegen/AssemblyGenerator.h"
16
#include "codegen/IntelInstructionSet.h"
17

18
#include <chrono>
19

20
CompilerComponentsFactory::CompilerComponentsFactory(Configuration configuration) :
386✔
21
        configuration { configuration }
386✔
22
{
23
}
386✔
24

25
std::unique_ptr<scanner::Scanner> CompilerComponentsFactory::makeScannerForSourceFile(std::string sourceFileName) const {
386✔
26
    Logger logger { configuration.isScannerLoggingEnabled() ? &std::cout : &NullStream::getInstance() };
386✔
27
    LogManager::registerComponentLogger(Component::SCANNER, logger);
386✔
28

29
    scanner::LexFileScannerReader scannerReader;
30
    return std::make_unique<scanner::Scanner>(sourceFileName, scannerReader.fromConfiguration(configuration.getLexPath()));
772✔
31
}
386✔
32

33
parser::Grammar CompilerComponentsFactory::makeGrammar() const {
380✔
34
    parser::BNFFileReader reader;
35
    return reader.readGrammar(configuration.getGrammarPath());
380✔
36
}
37

38
std::unique_ptr<parser::Parser> CompilerComponentsFactory::makeParser(parser::Grammar* grammar) const {
380✔
39
    Logger logger { configuration.isParserLoggingEnabled() ? &std::cout : &NullStream::getInstance() };
380✔
40
    LogManager::registerComponentLogger(Component::PARSER, logger);
380✔
41

42
    parser::ParsingTable* parsingTable;
43
    if (configuration.usingCustomGrammar()) {
380✔
UNCOV
44
        parsingTable = generateParsingTable(grammar);
×
45
    } else {
46
        parsingTable = new parser::FilePersistedParsingTable(configuration.getParsingTablePath(), grammar);
380✔
47
    }
48

49
    return std::make_unique<parser::LR1Parser>(parsingTable);
760✔
50
}
380✔
51

UNCOV
52
parser::ParsingTable* CompilerComponentsFactory::generateParsingTable(const parser::Grammar* grammar) const {
×
53
    std::cout << "Generating parsing table" << std::endl;
×
54
    std::chrono::steady_clock::time_point begin = std::chrono::steady_clock::now();
×
55

NEW
UNCOV
56
    parser::GeneratedParsingTable* generatedTable = new parser::GeneratedParsingTable(grammar);
×
57

UNCOV
58
    std::chrono::steady_clock::time_point end = std::chrono::steady_clock::now();
×
59
    std::cout << "Parsing table generation took "
×
60
        << std::chrono::duration_cast<std::chrono::microseconds>(end - begin).count()
×
61
        << "[µs]" << std::endl;
×
62

UNCOV
63
    std::string parsingTableLocation {"logs/parsing_table"};
×
64
    generatedTable->persistToFile(parsingTableLocation);
×
65

UNCOV
66
    std::cout << "Parsing table saved to: " << parsingTableLocation << std::endl;
×
67

UNCOV
68
    return generatedTable;
×
69
}
×
70

71
std::unique_ptr<parser::SyntaxTreeBuilder> CompilerComponentsFactory::makeSyntaxTreeBuilder(
384✔
72
        std::string sourceFileName, const parser::Grammar* grammar) const
73
{
74
    if (configuration.usingCustomGrammar()) {
384✔
75
        return std::make_unique<parser::ParseTreeBuilder>(sourceFileName, grammar);
6✔
76
    }
77
    if (configuration.isSyntaxTreeLoggingEnabled()) {
378✔
78
        return std::make_unique<ast::VerboseSyntaxTreeBuilder>(sourceFileName, grammar);
378✔
79
    }
UNCOV
80
    return std::make_unique<ast::AbstractSyntaxTreeBuilder>(grammar);
×
81
}
82

83
std::unique_ptr<codegen::AssemblyGenerator> CompilerComponentsFactory::makeAssemblyGenerator(std::ostream* assemblyFile) const {
364✔
84
    return std::make_unique<codegen::AssemblyGenerator>(
85
            std::make_unique<codegen::StackMachine>(
728✔
86
                    assemblyFile,
87
                    std::make_unique<codegen::IntelInstructionSet>(),
728✔
88
                    std::make_unique<codegen::Amd64Registers>()));
1,092✔
89
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE TRIAL · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc