-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathsymbol.cpp
More file actions
73 lines (58 loc) · 3.68 KB
/
symbol.cpp
File metadata and controls
73 lines (58 loc) · 3.68 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
69
70
71
72
73
#include <iostream>
#include "symbol.hh"
TableSymbol::TableSymbol() {
init();
}
void TableSymbol::init() {
table.push_back(std::make_unique<Symbol>("CODE", "vtype", "vtype id DECL CODE"));
table.push_back(std::make_unique<Symbol>("CODE", "$", "e"));
table.push_back(std::make_unique<Symbol>("DECL", "semi", "semi"));
table.push_back(std::make_unique<Symbol>("DECL", "lparen", "lparen ARG rparen lbrace BLOCK RETURN rbrace"));
table.push_back(std::make_unique<Symbol>("ARG", "vtype", "vtype id MOREARGS"));
table.push_back(std::make_unique<Symbol>("ARG", "rparen", "e"));
table.push_back(std::make_unique<Symbol>("MOREARGS", "rparen", "e"));
table.push_back(std::make_unique<Symbol>("MOREARGS", "comma", "comma vtype id MOREARGS"));
table.push_back(std::make_unique<Symbol>("BLOCK", "vtype", "STMT BLOCK"));
table.push_back(std::make_unique<Symbol>("BLOCK", "id", "STMT BLOCK"));
table.push_back(std::make_unique<Symbol>("BLOCK", "if", "STMT BLOCK"));
table.push_back(std::make_unique<Symbol>("BLOCK", "while", "STMT BLOCK"));
table.push_back(std::make_unique<Symbol>("BLOCK", "return", "e"));
table.push_back(std::make_unique<Symbol>("BLOCK", "rbrace", "e"));
table.push_back(std::make_unique<Symbol>("STMT", "vtype", "vtype id semi"));
table.push_back(std::make_unique<Symbol>("STMT", "id", "id RHSORFCALL semi"));
table.push_back(std::make_unique<Symbol>("STMT", "if", "if lparen COND rparen lbrace BLOCK rbrace else lbrace BLOCK rbrace"));
table.push_back(std::make_unique<Symbol>("STMT", "while", "while lparen COND rparen lbrace BLOCK rbrace"));
table.push_back(std::make_unique<Symbol>("RHSORFCALL", "assign", "assign RHS"));
table.push_back(std::make_unique<Symbol>("RHS", "id", "EXPR"));
table.push_back(std::make_unique<Symbol>("RHS", "lparen", "EXPR"));
table.push_back(std::make_unique<Symbol>("RHS", "num", "EXPR"));
table.push_back(std::make_unique<Symbol>("RHS", "literal", "literal"));
table.push_back(std::make_unique<Symbol>("EXPR", "id", "TERM EXPR2"));
table.push_back(std::make_unique<Symbol>("EXPR", "lparen", "TERM EXPR2"));
table.push_back(std::make_unique<Symbol>("EXPR", "num", "TERM EXPR2"));
table.push_back(std::make_unique<Symbol>("EXPR2", "semi", "e"));
table.push_back(std::make_unique<Symbol>("EXPR2", "rparen", "e"));
table.push_back(std::make_unique<Symbol>("EXPR2", "addsub", "addsub EXPR"));
table.push_back(std::make_unique<Symbol>("TERM", "id", "FACTOR TERM2"));
table.push_back(std::make_unique<Symbol>("TERM", "lparen", "FACTOR TERM2"));
table.push_back(std::make_unique<Symbol>("TERM", "num", "FACTOR TERM2"));
table.push_back(std::make_unique<Symbol>("TERM2", "semi", "e"));
table.push_back(std::make_unique<Symbol>("TERM2", "rparen", "e"));
table.push_back(std::make_unique<Symbol>("TERM2", "addsub", "e"));
table.push_back(std::make_unique<Symbol>("TERM2", "multdiv", "multdiv TERM"));
table.push_back(std::make_unique<Symbol>("FACTOR", "id", "id"));
table.push_back(std::make_unique<Symbol>("FACTOR", "lparen", "lparen EXPR rparen"));
table.push_back(std::make_unique<Symbol>("FACTOR", "num", "num"));
table.push_back(std::make_unique<Symbol>("COND", "id", "FACTOR comp FACTOR"));
table.push_back(std::make_unique<Symbol>("COND", "lparen", "FACTOR comp FACTOR"));
table.push_back(std::make_unique<Symbol>("COND", "num", "FACTOR comp FACTOR"));
table.push_back(std::make_unique<Symbol>("RETURN", "return", "return FACTOR semi"));
}
// Iterating over the table to find the matching token - returning empty string otherwise
std::string TableSymbol::find(std::string index, std::string input) {
for (auto &tmp : table) {
if (tmp->index == index && tmp->input == input)
return tmp->result;
}
return "error";
}