-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathmain.cpp
More file actions
68 lines (60 loc) · 2.83 KB
/
main.cpp
File metadata and controls
68 lines (60 loc) · 2.83 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
/**
Compiler Phase 2: PRSGEN
grammar_parser.h
Purpose: Takes in a file of grammar rules (non-terminals definition) and parses into non-terminals, terminals and production rules.
@author(s) Amr Elzawawy , Abdelrahman El-Dawy, Abdallah El-Maradny, Omar Swidan, Mostafa Yousry.
@version 1.0
@date 24/4/2020
*/
#include "grammar_parser.h"
#include "parsing_table_generator.h"
#include "../lexgen/language_parser.h"
#include "../lexgen/nfa.h"
#include "../lexgen/dfa.h"
#include "../lexgen/lexical_analyzer_driver.h"
#include "predictive_parser.h"
#include <iostream>
using namespace std;
int main() {
auto language_parser = new LanguageParser();
language_parser->parseFile(
"../lexgen/test_cases/a_lexical_rules.txt");
NFA x = NFA();
NFAState *nfa_start_state = x.regex_to_nfa(language_parser->getInput_table(), language_parser->getExpressions());
DFA dfa_gen = DFA();
DFAState *dfa_start_state = dfa_gen.GenerateDFA(*nfa_start_state, x.get_input_table());
LexicalAnalyzerDriver lexicalAnalyzerDriver(dfa_start_state, "../lexgen/test_cases/a_test_program.txt",
language_parser->getExpressions());
GrammarParser grammarParser;
grammarParser.parseFile("../prsgen/test-cases/a_grammar.txt");
grammarParser.applyLeftFactoring();
grammarParser.eliminateLeftRecursion();
ParsingTableGenerator parsing_table_generator(grammarParser.getTerminals_(),
grammarParser.getNon_terminals_());
parsing_table_generator.computeFirst();
parsing_table_generator.computeFollow();
parsing_table_generator.constructParsingTable();
cout << "========================================================" << endl;
cout << "--------------------first sets--------------------------" << endl;
for (auto &&non_terminal: grammarParser.getNon_terminals_()) {
cout << non_terminal.getName_() << " first set: ";
for (auto &&element: non_terminal.getFirst_()) {
cout << element << " ";
}
cout << endl;
}
cout << "--------------------follow sets--------------------------" << endl;
for (auto &&non_terminal: grammarParser.getNon_terminals_()) {
cout << non_terminal.getName_() << " follow set: ";
for (auto &&element: non_terminal.getFollow_()) {
cout << element << " ";
}
cout << endl;
}
parsing_table_generator.writeParsingTable("../prsgen/output/parsing_table.csv");
PredicativeParser predicativeParser = PredicativeParser(lexicalAnalyzerDriver, grammarParser.getNon_terminals_(),
grammarParser.getTerminals_(),
"../prsgen/output/parsing_log.txt");
predicativeParser.Parse();
return 0;
}