Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
Help
Support
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
2
2022fall-Compiler_CMinus
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Service Desk
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Metrics
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
李晓奇
2022fall-Compiler_CMinus
Commits
f3c79837
Commit
f3c79837
authored
Sep 22, 2022
by
李晓奇
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Now it can pass a few tests. A clear bug is the regex for comment
parent
bae8f63b
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
41 additions
and
27 deletions
+41
-27
src/parser/lexical_analyzer.l
src/parser/lexical_analyzer.l
+39
-25
src/parser/syntax_analyzer.y
src/parser/syntax_analyzer.y
+1
-1
tests/parser/easy/expr.cminus
tests/parser/easy/expr.cminus
+1
-1
No files found.
src/parser/lexical_analyzer.l
View file @
f3c79837
...
@@ -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******/
%%
%%
src/parser/syntax_analyzer.y
View file @
f3c79837
...
@@ -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 valu
e;
struct _syntax_tree_node *nod
e;
}
}
/* TODO: Your tokens here. */
/* TODO: Your tokens here. */
...
...
tests/parser/easy/expr.cminus
View file @
f3c79837
...
@@ -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
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment