-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathparser.cpp
More file actions
executable file
·123 lines (89 loc) · 2.64 KB
/
parser.cpp
File metadata and controls
executable file
·123 lines (89 loc) · 2.64 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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
#include <string>
#include <iostream>
#include "tokendefs.h"
#include "datetypes.h"
#include "tokenizer.h"
#include "parser.h"
#include "exceptions.h"
using namespace std;
Parser::Parser() : tokenizer() {
}
LList* Parser::parseStream(istream & stream) { //predela stream na string a pak zavolá parseString
string str;
stream.seekg(0);
int length = stream.tellg();
if (length == -1) { // spatny stream (neexistujici soubor)
throw IOException();
}
stream.seekg(0);
str.reserve(length);
while (!stream.eof()) {
str += stream.get();
}
return this->parseString(str);
}
LList* Parser::parseString(string & s) {
this->tokenizer.tokenizeString(s);
LList *l = this->n_List(s); // celej zdroják je seznam příkazů
return l;
}
Elem * Parser::parseElem() {
Elem * e = NULL;
string tokRepr;
token tok = this->tokenizer.nextToken(tokRepr);
switch (tok) {
case LIST_BEGIN: // zacatek noveho expr. = leva zavorka
// e = LList(tokRepr);
e = this->n_List(tokRepr);
// if (this->tokenizer.nextToken(tokRepr) != LIST_END) {
// cout <<"NEUZAVRENA ZAVORKA"<<endl;
// return NULL; //TODO: throw neuzavrena zavorka
// }else {
// cout <<"UZAVRENA Z"<<endl;
// break;
// }
break;
case STRING_BEGIN:
e = this->n_String(tokRepr);
break;
case INT:
e = this->n_Int(tokRepr);
break;
case SYMBOL:
e = this->n_Symbol(tokRepr);
break;
case LIST_END:
return NULL;
case 0:
return NULL;
}
return e;
}
LList * Parser::n_List(string & tokRepr) { //vrati list s elementama; necheckuje zavorky
LList *l = new LList;
Elem * e;
l->line = this->tokenizer.line;
l->col = this->tokenizer.col;
while ((e = this->parseElem())) {
l->add(e);
}
return l;
}
LInt * Parser::n_Int(string & tokRepr) {
LInt * li = new LInt(tokRepr);
li->line = this->tokenizer.line;
li->col = this->tokenizer.col;
return li;
}
LString * Parser::n_String(string & tokRepr) {
LString * lstr = new LString(tokRepr);
lstr->line = this->tokenizer.line;
lstr->col = this->tokenizer.col;
return lstr;
}
LSymbol * Parser::n_Symbol(string & tokRepr) {
LSymbol * ls = new LSymbol(tokRepr);
ls->line = this->tokenizer.line;
ls->col = this->tokenizer.col;
return ls;
}