Compare commits

...

2 commits

Author SHA1 Message Date
8973390b2a
fix Makefile 2025-03-26 11:09:56 +08:00
29b5b6c1f3
fix scanner error 2025-03-26 11:09:51 +08:00
7 changed files with 96 additions and 58 deletions

View file

@ -1,6 +1,6 @@
CC = zig cc -O2
CC = gcc
all: parser.tab.o lex.yy.o node.o main.o
program: parser.tab.o lex.yy.o node.o main.o
$(CC) ./parser.tab.o ./lex.yy.o ./node.o ./main.o -o program -lfl
main.o: main.c
@ -21,6 +21,19 @@ lex.yy.o: lex.yy.c
lex.yy.c: ./scanner.l
flex scanner.l
.PHONY: clean
.PHONY: clean test
clean:
rm parser.tab.c parser.tab.h parser.tab.o lex.yy.o lex.yy.c program main.o node.o
test: program
@echo Test test1:
./program test1
@read
@echo Test test2:
./program test2
@read
@echo Test test3:
./program test3
@read
@echo Test test4:
./program test4

108
parser.y
View file

@ -22,14 +22,14 @@
Program:
ExtDefList {
pNode children[1] = { $1 };
$$ = newNode(Program, yylineno, 1, children, nullValue());
$$ = newNode(Program, $1->line, 1, children, nullValue());
root = $$;
}
;
ExtDefList:
ExtDef ExtDefList {
pNode children[2] = { $1, $2 };
$$ = newNode(ExtDefList, yylineno, 2, children, nullValue());
$$ = newNode(ExtDefList, $1->line, 2, children, nullValue());
}
| {
$$ = newNode(ExtDefList, -1, 0, NULL, nullValue());
@ -38,25 +38,25 @@ ExtDefList:
ExtDef:
Specifier ExtDecList SEMI {
pNode children[3] = { $1, $2, $3 };
$$ = newNode(ExtDef, yylineno, 3, children, nullValue());
$$ = newNode(ExtDef, $1->line, 3, children, nullValue());
}
| Specifier SEMI {
pNode children[2] = { $1, $2 };
$$ = newNode(ExtDef, yylineno, 2, children, nullValue());
$$ = newNode(ExtDef, $1->line, 2, children, nullValue());
}
| Specifier FunDec CompSt {
pNode children[3] = { $1, $2, $3 };
$$ = newNode(ExtDef, yylineno, 3, children, nullValue());
$$ = newNode(ExtDef, $1->line, 3, children, nullValue());
}
;
ExtDecList:
VarDec {
pNode children[1] = { $1 };
$$ = newNode(ExtDecList, yylineno, 1, children, nullValue());
$$ = newNode(ExtDecList, $1->line, 1, children, nullValue());
}
| VarDec COMMA ExtDecList {
pNode children[3] = { $1, $2, $3 };
$$ = newNode(ExtDecList, yylineno, 3, children, nullValue());
$$ = newNode(ExtDecList, $1->line, 3, children, nullValue());
}
;
@ -64,31 +64,31 @@ ExtDecList:
Specifier:
TYPE_INT {
pNode children[1] = { $1 };
$$ = newNode(Specifier, yylineno, 1, children, nullValue());
$$ = newNode(Specifier, $1->line, 1, children, nullValue());
}
| TYPE_FLOAT {
pNode children[1] = { $1 };
$$ = newNode(Specifier, yylineno, 1, children, nullValue());
$$ = newNode(Specifier, $1->line, 1, children, nullValue());
}
| StructSpecifier {
pNode children[1] = { $1 };
$$ = newNode(Specifier, yylineno, 1, children, nullValue());
$$ = newNode(Specifier, $1->line, 1, children, nullValue());
}
;
StructSpecifier:
STRUCT OptTag LC DefList RC {
pNode children[5] = { $1, $2, $3, $4, $5 };
$$ = newNode(StructSpecifier, yylineno, 5, children, nullValue());
$$ = newNode(StructSpecifier, $1->line, 5, children, nullValue());
}
| STRUCT Tag {
pNode children[2] = { $1, $2 };
$$ = newNode(StructSpecifier, yylineno, 2, children, nullValue());
$$ = newNode(StructSpecifier, $1->line, 2, children, nullValue());
}
;
OptTag:
ID {
pNode children[1] = { $1 };
$$ = newNode(OptTag, yylineno, 1, children, nullValue());
$$ = newNode(OptTag, $1->line, 1, children, nullValue());
}
| {
$$ = newNode(OptTag, -1, 0, NULL, nullValue());
@ -97,7 +97,7 @@ OptTag:
Tag:
ID {
pNode children[1] = { $1 };
$$ = newNode(Tag, yylineno, 1, children, nullValue());
$$ = newNode(Tag, $1->line, 1, children, nullValue());
}
;
@ -105,37 +105,37 @@ Tag:
VarDec:
ID {
pNode children[1] = { $1 };
$$ = newNode(VarDec, yylineno, 1, children, nullValue());
$$ = newNode(VarDec, $1->line, 1, children, nullValue());
}
| VarDec LB INTEGER RB {
pNode children[4] = { $1, $2, $3, $4 };
$$ = newNode(VarDec, yylineno, 4, children, nullValue());
$$ = newNode(VarDec, $1->line, 4, children, nullValue());
}
;
FunDec:
ID LP VarList RP {
pNode children[4] = { $1, $2, $3, $4 };
$$ = newNode(FunDec, yylineno, 4, children, nullValue());
$$ = newNode(FunDec, $1->line, 4, children, nullValue());
}
| ID LP RP {
pNode children[3] = { $1, $2, $3 };
$$ = newNode(FunDec, yylineno, 3, children, nullValue());
$$ = newNode(FunDec, $1->line, 3, children, nullValue());
}
;
VarList:
ParamDec COMMA VarList {
pNode children[3] = { $1, $2, $3 };
$$ = newNode(VarList, yylineno, 3, children, nullValue());
$$ = newNode(VarList, $1->line, 3, children, nullValue());
}
| ParamDec {
pNode children[1] = { $1 };
$$ = newNode(VarList, yylineno, 1, children, nullValue());
$$ = newNode(VarList, $1->line, 1, children, nullValue());
}
;
ParamDec:
Specifier VarDec {
pNode children[1] = { $1 };
$$ = newNode(ParamDec, yylineno, 1, children, nullValue());
$$ = newNode(ParamDec, $1->line, 1, children, nullValue());
}
;
@ -143,13 +143,13 @@ ParamDec:
CompSt:
LC DefList StmtList RC {
pNode children[4] = { $1, $2, $3, $4 };
$$ = newNode(CompSt, yylineno, 4, children, nullValue());
$$ = newNode(CompSt, $1->line, 4, children, nullValue());
}
;
StmtList:
Stmt StmtList {
pNode children[2] = { $1, $2 };
$$ = newNode(StmtList, yylineno, 2, children, nullValue());
$$ = newNode(StmtList, $1->line, 2, children, nullValue());
}
| {
$$ = newNode(StmtList, -1, 0, NULL, nullValue());
@ -158,27 +158,27 @@ StmtList:
Stmt:
Exp SEMI {
pNode children[2] = { $1, $2 };
$$ = newNode(Stmt, yylineno, 2, children, nullValue());
$$ = newNode(Stmt, $1->line, 2, children, nullValue());
}
| CompSt {
pNode children[1] = { $1 };
$$ = newNode(Stmt, yylineno, 1, children, nullValue());
$$ = newNode(Stmt, $1->line, 1, children, nullValue());
}
| RETURN Exp SEMI {
pNode children[3] = { $1, $2, $3 };
$$ = newNode(Stmt, yylineno, 3, children, nullValue());
$$ = newNode(Stmt, $1->line, 3, children, nullValue());
}
| IF LP Exp RP Stmt {
pNode children[5] = { $1, $2, $3, $4, $5 };
$$ = newNode(Stmt, yylineno, 5, children, nullValue());
$$ = newNode(Stmt, $1->line, 5, children, nullValue());
}
| IF LP Exp RP Stmt ELSE Stmt {
pNode children[7] = { $1, $2, $3, $4, $5, $6, $7 };
$$ = newNode(Stmt, yylineno, 7, children, nullValue());
$$ = newNode(Stmt, $1->line, 7, children, nullValue());
}
| WHILE LP Exp RP Stmt {
pNode children[5] = { $1, $2, $3, $4, $5 };
$$ = newNode(Stmt, yylineno, 5, children, nullValue());
$$ = newNode(Stmt, $1->line, 5, children, nullValue());
}
| error SEMI
;
@ -187,7 +187,7 @@ Stmt:
DefList:
Def DefList {
pNode children[2] = { $1, $2 };
$$ = newNode(DefList, yylineno, 2, children, nullValue());
$$ = newNode(DefList, $1->line, 2, children, nullValue());
}
| {
$$ = newNode(DefList, -1, 0, NULL, nullValue());
@ -196,27 +196,27 @@ DefList:
Def:
Specifier DecList SEMI {
pNode children[3] = { $1, $2, $3 };
$$ = newNode(Def, yylineno, 3, children, nullValue());
$$ = newNode(Def, $1->line, 3, children, nullValue());
}
;
DecList:
Dec {
pNode children[1] = { $1 };
$$ = newNode(DecList, yylineno, 1, children, nullValue());
$$ = newNode(DecList, $1->line, 1, children, nullValue());
}
| Dec COMMA DecList {
pNode children[3] = { $1, $2, $3 };
$$ = newNode(DecList, yylineno, 3, children, nullValue());
$$ = newNode(DecList, $1->line, 3, children, nullValue());
}
;
Dec:
VarDec {
pNode children[1] = { $1 };
$$ = newNode(Dec, yylineno, 1, children, nullValue());
$$ = newNode(Dec, $1->line, 1, children, nullValue());
}
| VarDec ASSIGNOP Exp {
pNode children[3] = { $1, $2, $3 };
$$ = newNode(Dec, yylineno, 3, children, nullValue());
$$ = newNode(Dec, $1->line, 3, children, nullValue());
}
;
@ -224,82 +224,82 @@ Dec:
Exp:
Exp ASSIGNOP Exp {
pNode children[3] = { $1, $2, $3 };
$$ = newNode(Exp, yylineno, 3, children, nullValue());
$$ = newNode(Exp, $1->line, 3, children, nullValue());
}
| Exp AND Exp {
pNode children[3] = { $1, $2, $3 };
$$ = newNode(Exp, yylineno, 3, children, nullValue());
$$ = newNode(Exp, $1->line, 3, children, nullValue());
}
| Exp OR Exp {
pNode children[3] = { $1, $2, $3 };
$$ = newNode(Exp, yylineno, 3, children, nullValue());
$$ = newNode(Exp, $1->line, 3, children, nullValue());
}
| Exp PLUS Exp {
pNode children[3] = { $1, $2, $3 };
$$ = newNode(Exp, yylineno, 3, children, nullValue());
$$ = newNode(Exp, $1->line, 3, children, nullValue());
}
| Exp MINUS Exp {
pNode children[3] = { $1, $2, $3 };
$$ = newNode(Exp, yylineno, 3, children, nullValue());
$$ = newNode(Exp, $1->line, 3, children, nullValue());
}
| Exp TIMES Exp {
pNode children[3] = { $1, $2, $3 };
$$ = newNode(Exp, yylineno, 3, children, nullValue());
$$ = newNode(Exp, $1->line, 3, children, nullValue());
}
| Exp DIV Exp {
pNode children[3] = { $1, $2, $3 };
$$ = newNode(Exp, yylineno, 3, children, nullValue());
$$ = newNode(Exp, $1->line, 3, children, nullValue());
}
| LP Exp RP {
pNode children[3] = { $1, $2, $3 };
$$ = newNode(Exp, yylineno, 3, children, nullValue());
$$ = newNode(Exp, $1->line, 3, children, nullValue());
}
| MINUS Exp {
pNode children[2] = { $1, $2 };
$$ = newNode(Exp, yylineno, 2, children, nullValue());
$$ = newNode(Exp, $1->line, 2, children, nullValue());
}
| NOT Exp {
pNode children[2] = { $1, $2 };
$$ = newNode(Exp, yylineno, 2, children, nullValue());
$$ = newNode(Exp, $1->line, 2, children, nullValue());
}
| ID LP Args RP {
pNode children[4] = { $1, $2, $3, $4 };
$$ = newNode(Exp, yylineno, 4, children, nullValue());
$$ = newNode(Exp, $1->line, 4, children, nullValue());
}
| ID LP RP {
pNode children[3] = { $1, $2, $3 };
$$ = newNode(Exp, yylineno, 3, children, nullValue());
$$ = newNode(Exp, $1->line, 3, children, nullValue());
}
| Exp LB Exp RB {
pNode children[4] = { $1, $2, $3, $4 };
$$ = newNode(Exp, yylineno, 4, children, nullValue());
$$ = newNode(Exp, $1->line, 4, children, nullValue());
}
| Exp DOT ID {
pNode children[3] = { $1, $2, $3 };
$$ = newNode(Exp, yylineno, 3, children, nullValue());
$$ = newNode(Exp, $1->line, 3, children, nullValue());
}
| ID {
pNode children[1] = { $1 };
$$ = newNode(Exp, yylineno, 1, children, nullValue());
$$ = newNode(Exp, $1->line, 1, children, nullValue());
}
| INTEGER {
pNode children[1] = { $1 };
$$ = newNode(Exp, yylineno, 1, children, nullValue());
$$ = newNode(Exp, $1->line, 1, children, nullValue());
}
| FLOAT {
pNode children[1] = { $1 };
$$ = newNode(Exp, yylineno, 1, children, nullValue());
$$ = newNode(Exp, $1->line, 1, children, nullValue());
}
;
Args:
Exp COMMA Args {
pNode children[3] = { $1, $2, $3 };
$$ = newNode(Args, yylineno, 3, children, nullValue());
$$ = newNode(Args, $1->line, 3, children, nullValue());
}
| Exp {
pNode children[1] = { $1 };
$$ = newNode(Exp, yylineno, 1, children, nullValue());
$$ = newNode(Exp, $1->line, 1, children, nullValue());
}
;

View file

@ -182,7 +182,6 @@ BLOCK_COMMENT \/\*(.|\n)*?\*\/
. {
errors += 1;
fprintf(stderr, "Error type A at Line %d: Mysterious character \"%s\".\n", yylineno, yytext);
return YYerror;
}
%%

5
test1 Normal file
View file

@ -0,0 +1,5 @@
int main()
{
int i = 1;
int j = ~i;
}

7
test2 Normal file
View file

@ -0,0 +1,7 @@
int main()
{
float a[10,2];
int i;
a[5,3] = 1.5;
if (a[1][2] == 0) i = 1 else i = 0;
}

5
test3 Normal file
View file

@ -0,0 +1,5 @@
int inc()
{
int i;
i = i + 1;
}

9
test4 Normal file
View file

@ -0,0 +1,9 @@
struct Complex
{
float real, image;
};
int main()
{
struct Complex x;
y.image = 3.5;
}