-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathwenyan.l
113 lines (106 loc) · 5.29 KB
/
wenyan.l
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
%{
#include <iostream>
#include <sstream>
#include <cstdio>
#include <vector>
#include <stack>
#include <string>
#include "ErrorLog.h"
#include "AST.h"
#include "wenyan.x.tab.h"
extern YYSTYPE yylval;
int n_line = 1;
int n_char = 1;
TextPosition readtoken(char* str){
TextPosition ret(n_line, n_char);
n_char += strlen(str);
return ret;
}
long long parseNumberString(const std::string &str){
std::stack<long long> sta;
for(auto i:str){
if (isspace(i)) continue;
if (i=='0') continue;
if (isdigit(i)) sta.push((int)(i-'0'));
else if(i=='s'){
if(sta.empty()) sta.push(10);
else{
long long t = sta.top();
if(t<=10) sta.pop(), sta.push(t*10);
}
}
char token[4] = {'b','k','w','y'};
long long val[4] = {100,1000,10000,100000000};
for(int j=0;j<4;j++)if(i==token[j]){
long long t =0 ;
while(!sta.empty() && sta.top()<val[j]) t+=sta.top(), sta.pop();
sta.push(t*val[j]);
}
}
long long ret = 0;
while(!sta.empty()){
ret += sta.top();
sta.pop();
}
return ret;
}
%}
%%
[0-9bskwy]+(\.[0-9]+)? {yylval = new Node(NUMBER, readtoken(yytext)); yylval->setVal(parseNumberString(yytext)); return NUMBER;}
\"[^\"]*\" {yylval = new Node(CSTRING, readtoken(yytext)); yylval->setStr(yytext); return CSTRING;}
$name_[0-9]* {yylval = new Node(NAME, readtoken(yytext)); yylval->setStr(yytext); return NAME;}
function {yylval = new Node(FUNCTION, readtoken(yytext));return FUNCTION;}
func_begin {yylval = new Node(FUNC_BEGIN, readtoken(yytext));return FUNC_BEGIN;}
func_end {yylval = new Node(FUNC_END, readtoken(yytext));return FUNC_END;}
func_param {yylval = new Node(FUNC_PARAM, readtoken(yytext));return FUNC_PARAM;}
return_it {yylval = new Node(RETURN_IT, readtoken(yytext));return RETURN_IT;}
return {yylval = new Node(RETURN, readtoken(yytext));return RETURN;}
use_func {yylval = new Node(USE_FUNC, readtoken(yytext));return USE_FUNC;}
use_to {yylval = new Node(USE_TO, readtoken(yytext));return USE_TO;}
this_is {yylval = new Node(THIS_IS, readtoken(yytext));return THIS_IS;}
def {yylval = new Node(DEF, readtoken(yytext));return DEF;}
named_as {yylval = new Node(NAMED_AS, readtoken(yytext));return NAMED_AS;}
def_named_as {yylval = new Node(DEFNAMED_AS, readtoken(yytext));return DEFNAMED_AS;}
def_as {yylval = new Node(DEF_AS, readtoken(yytext));return DEF_AS;}
number {yylval = new Node(TYPE_NUMBER, readtoken(yytext));return TYPE_NUMBER;}
string {yylval = new Node(TYPE_STRING, readtoken(yytext));return TYPE_STRING;}
print_it {yylval = new Node(PRINT_IT, readtoken(yytext));return PRINT_IT;}
print {yylval = new Node(PRINT, readtoken(yytext));return PRINT;}
do {yylval = new Node(DO, readtoken(yytext)); return DO;}
while_true {yylval = new Node(WHILE_TRUE, readtoken(yytext)); return WHILE_TRUE;}
times {yylval = new Node(TIMES, readtoken(yytext)); return TIMES;}
end {yylval = new Node(END, readtoken(yytext)); return END;}
break {yylval = new Node(BREAK, readtoken(yytext)); return BREAK;}
== {yylval = new Node(LOGIC_EQUAL, readtoken(yytext)); return LOGIC_EQUAL;}
\> {yylval = new Node(LOGIC_GREATER, readtoken(yytext)); return LOGIC_GREATER;}
\< {yylval = new Node(LOGIC_LESS, readtoken(yytext)); return LOGIC_LESS;}
\+ {yylval = new Node(ARI_ADD, readtoken(yytext)); return ARI_ADD;}
- {yylval = new Node(ARI_SUB, readtoken(yytext)); return ARI_SUB;}
\* {yylval = new Node(ARI_MUL, readtoken(yytext)); return ARI_MUL;}
\/ {yylval = new Node(ARI_DIV, readtoken(yytext)); return ARI_DIV;}
% {yylval = new Node(ARI_MOD, readtoken(yytext)); return ARI_MOD;}
\n {n_line ++; n_char = 1;}
. {n_char += strlen(yytext);}
if {yylval = new Node(IF_BEGIN, readtoken(yytext)); return IF_BEGIN;}
end_stat {yylval = new Node(IF_STAT, readtoken(yytext)); return IF_STAT;}
end_if {yylval = new Node(IF_END, readtoken(yytext)); return IF_END;}
else {yylval = new Node(IF_ELSE, readtoken(yytext)); return IF_ELSE;}
get {yylval = new Node(GET, readtoken(yytext)); return GET;}
it {yylval = new Node(IT, readtoken(yytext)); return IT;}
eval {yylval = new Node(EVAL, readtoken(yytext)); return EVAL;}
floor_it {yylval = new Node(FLOOR_IT, readtoken(yytext));return FLOOR_IT;}
round_it {yylval = new Node(ROUND_IT, readtoken(yytext));return ROUND_IT;}
list_concat {yylval = new Node(LIST_CONCAT, readtoken(yytext));return LIST_CONCAT;}
list_slice {yylval = new Node(LIST_SLICE, readtoken(yytext));return LIST_SLICE;}
list {yylval = new Node(LIST_E, readtoken(yytext));return LIST_E;}
with {yylval = new Node(WITH, readtoken(yytext));return WITH;}
to {yylval = new Node(TO, readtoken(yytext));return TO;}
inf {yylval = new Node(INF, readtoken(yytext));return INF;}
forin {yylval = new Node(FORIN, readtoken(yytext));return FORIN;}
contains {yylval = new Node(CONTAINS, readtoken(yytext));return CONTAINS;}
length {yylval = new Node(LENGTH, readtoken(yytext));return LENGTH;}
%%
int yywrap()
{
return(1);
}