Commit f3c79837 authored by 李晓奇's avatar 李晓奇

Now it can pass a few tests. A clear bug is the regex for comment

parent bae8f63b
...@@ -7,12 +7,24 @@ ...@@ -7,12 +7,24 @@
#include "syntax_tree.h" #include "syntax_tree.h"
#include "syntax_analyzer.h" #include "syntax_analyzer.h"
int lines; int lines = 1;
int pos_start; int pos_start;
int pos_end; int pos_end;
void pass_node(char *text){ void pass_node(char *text){
yylval.value = new_syntax_tree_node(text); yylval.node = new_syntax_tree_node(text);
}
void comment_helper(char *comment, unsigned int len)
{
pos_end += 2;
for (int i = 2; i < len-2; i++){
if (comment[i] == '\n' || comment[i] == '\r'){
lines++;
pos_end = 0;
} else
pos_end++;
}
pos_end += 2;
} }
/*****************声明和选项设置 end*****************/ /*****************声明和选项设置 end*****************/
...@@ -23,8 +35,11 @@ letter [a-zA-Z] ...@@ -23,8 +35,11 @@ letter [a-zA-Z]
digit [0-9] digit [0-9]
ID {letter}+ ID {letter}+
INTEGER {digit}+ INTEGER {digit}+
FLOAT {digit}+\. | {digit}*\.{digit}+ FLOAT {digit}+\.|{digit}*\.{digit}+
COMMENT "/*".*"*/"
NEWLINE \r\n|\r|\n
WHITESPACE [ \t]
/* /*
%token <node> _IF _ELSE _WHILE _RETURN _INT _FLOAT _VOID %token <node> _IF _ELSE _WHILE _RETURN _INT _FLOAT _VOID
...@@ -35,31 +50,30 @@ FLOAT {digit}+\. | {digit}*\.{digit}+ ...@@ -35,31 +50,30 @@ FLOAT {digit}+\. | {digit}*\.{digit}+
*/ */
%% %%
if {pos_start = pos_end; pos_end += 2; pass_node("if"); return _IF;} {COMMENT} { comment_helper(yytext, yyleng); }
else {pos_start = pos_end; pos_end += 4; pass_node("else"); return _ELSE;} if { pos_start = pos_end; pos_end += 2; pass_node("if"); return _IF;}
while {pos_start = pos_end; pos_end += 5; pass_node("while"); return _WHILE;} else { pos_start = pos_end; pos_end += 4; pass_node("else"); return _ELSE;}
return {pos_start = pos_end; pos_end += 6; pass_node("return"); return _RETURN;} while { pos_start = pos_end; pos_end += 5; pass_node("while"); return _WHILE;}
int {pos_start = pos_end; pos_end += 3; pass_node("int"); return _INT;} return { pos_start = pos_end; pos_end += 6; pass_node("return"); return _RETURN;}
float {pos_start = pos_end; pos_end += 5; pass_node("float"); return _FLOAT;} int { pos_start = pos_end; pos_end += 3; pass_node("int"); return _INT;}
void {pos_start = pos_end; pos_end += 4; pass_node("void"); return _VOID;} float { pos_start = pos_end; pos_end += 5; pass_node("float"); return _FLOAT;}
void { pos_start = pos_end; pos_end += 4; pass_node("void"); return _VOID;}
{ID} {pos_start = pos_end; pos_end += yyleng; pass_node(yytext); return _ID;} {ID} { pos_start = pos_end; pos_end += yyleng; pass_node(yytext); return _ID;}
{INTEGER} {pos_start = pos_end; pos_end += yyleng; pass_node(yytext); return _INTEGER;} {INTEGER} { pos_start = pos_end; pos_end += yyleng; pass_node(yytext); return _INTEGER;}
{FLOAT} {pos_start = pos_end; pos_end += yyleng; pass_node(yytext); return _FLOATPOINT;} {FLOAT} { pos_start = pos_end; pos_end += yyleng; pass_node(yytext); return _FLOATPOINT;}
\= {pos_start = pos_end; pos_end += 1; pass_node("="); return _ASSIGN;} "=" { pos_start = pos_end; pos_end += 1; pass_node("="); return _ASSIGN;}
"<=" | ">=" | "<" | ">" | "==" | "!=" {pos_start = pos_end; pos_end += yyleng; pass_node(yytext); return _RELOP;} "<="|">="|"<"|">"|"=="|"!=" { pos_start = pos_end; pos_end += yyleng; pass_node(yytext); return _RELOP;}
"+" | "-" {pos_start = pos_end; pos_end += 1; pass_node(yytext); return _ADD_OP;} "+"|"-" { pos_start = pos_end; pos_end += 1; pass_node(yytext); return _ADD_OP;}
"*" | "/" {pos_start = pos_end; pos_end += 1; pass_node(yytext); return _MUL_OP;} "*"|"/" { pos_start = pos_end; pos_end += 1; pass_node(yytext); return _MUL_OP;}
\[ | \] {pos_start = pos_end; pos_end += 1; pass_node(yytext); return yytext[0] == '[' ? _L_SQUARE : _R_SQUARE;} "["|"]" { pos_start = pos_end; pos_end += 1; pass_node(yytext); return yytext[0] == '[' ? _L_SQUARE : _R_SQUARE;}
\( | \) {pos_start = pos_end; pos_end += 1; pass_node(yytext); return yytext[0] == '(' ? _L_PARE : _R_PARE;} "("|")" { pos_start = pos_end; pos_end += 1; pass_node(yytext); return yytext[0] == '(' ? _L_PARE : _R_PARE;}
\{ | \} {pos_start = pos_end; pos_end += 1; pass_node(yytext); return yytext[0] == '{' ? _L_BRACKET : _R_BRACKET;} "{"|"}" { pos_start = pos_end; pos_end += 1; pass_node(yytext); return yytext[0] == '{' ? _L_BRACKET : _R_BRACKET;}
"," | ";" {pos_start = pos_end; pos_end += 1; pass_node(yytext); return yytext[0] == ',' ? _COMMA : _SEMI;} ","|";" { pos_start = pos_end; pos_end += 1; pass_node(yytext); return yytext[0] == ',' ? _COMMA : _SEMI;}
" " | \t { pos_end++; } {WHITESPACE} { pos_end++; }
\r\n | \n | \r { lines++; pos_end = 0;} {NEWLINE} { lines++; pos_end = 0;}
/* . { pos_start = pos_end; pos_end++; return ERROR; } */
/****请在此补全所有flex的模式与动作 end******/
%% %%
...@@ -32,7 +32,7 @@ syntax_tree_node *node(const char *node_name, int children_num, ...); ...@@ -32,7 +32,7 @@ syntax_tree_node *node(const char *node_name, int children_num, ...);
Hint: See pass_node(), node(), and syntax_tree.h. Hint: See pass_node(), node(), and syntax_tree.h.
Use forward declaring. */ Use forward declaring. */
%union { %union {
node value; struct _syntax_tree_node *node;
} }
/* TODO: Your tokens here. */ /* TODO: Your tokens here. */
......
...@@ -13,4 +13,4 @@ int main(void){ ...@@ -13,4 +13,4 @@ int main(void){
x = a/x; x = a/x;
return 0; return 0;
} }
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment