-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathinterpreter.lex
More file actions
110 lines (89 loc) · 2.34 KB
/
interpreter.lex
File metadata and controls
110 lines (89 loc) · 2.34 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
%option noyywrap
%{
#include "structs_interpreter.hpp"
#include <iostream>
#include "y.tab.h"
int yyparse();
//---- Global variables
extern unsigned int line;
extern unsigned int column;
extern bool debug;
//---- Functions
inline void assign_yylval_str(char* text);
%}
%x COMMENT TEXT_
%%
"WHILE"|"while" { column += 5; return WHILE; }
"PRINT"|"print" { column += 5; return PRINT; }
"IF"|"if" { column += 2; return IF; }
["] { BEGIN(TEXT_); }
<TEXT_>[ -~]*["] {
assign_yylval_str(yytext);
yylval.str->pop_back();
BEGIN(INITIAL);
return TEXT;
}
<TEXT_>. { return UNK; }
[a-zA-Z][a-zA-Z0-9_]* { //VARIABLE
assign_yylval_str(yytext);
return VARNAME;
}
"+"|"-"|"*"|"/"|"^" { //OPERATOR
column++;
return yytext[0];
}
[0-9]+([.][0-9]+)? { //NUMBER
column += std::string(yytext).length();
yylval.fVal = atof(yytext);
return NUMBER;
}
"=="|"!="|">"|">="|"<"|"<=" { //COMPARATOR
column += std::string(yytext).length();
assign_yylval_str(yytext);
return COMPARATOR;
}
[=;(){},] { column++; return yytext[0]; }
"//".*$ { /*komentarz jedno-wierszowy*/ }
"/*" { column += 2; BEGIN(COMMENT); }
<COMMENT>(\n|\r|\r\n) { line++; }
<COMMENT>"*/" { column += 2; BEGIN(INITIAL); }
<COMMENT>[\t] { column += 5; }
<COMMENT>. { column++; }
[\n]|[\r]|[\r\n] { line++; return NEWLINE; }
[ ] { column++; }
[\t] { column += 5; }
. { return UNK; }
%%
int display_manual(){
std::cout << "\nRuns interpreter for simple custom programming language.\n\n";
std::cout << "INTERPRETER -n\n";
std::cout << "INTERPRETER -d\n\n";
std::cout << "-n Runs application in normal mode.\n";
std::cout << "-d Runs application in debug mode.\n";
return 1;
}
int main(int argc, char* argv[]){
if (argc == 2) {
if(std::string(argv[1]) == "-n") { debug = false; }
else if (std::string(argv[1]) == "-d") { debug = true; }
else { return display_manual(); }
}
else { return display_manual(); }
return yyparse();
}
int yyerror(const char* str) {
std::cerr << line << ':' << column << ": error: ";
std::cerr << str << "!\n";
return 1;
}
//---- Functions
/*
* Assigns text content to yylval str field.
*
* @param text Text to assign to yylval str.
* @return void.
*/
void assign_yylval_str(char* text) {
yylval.str = new std::string(text);
column += yylval.str->length();
}