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 $(CC) ./parser.tab.o ./lex.yy.o ./node.o ./main.o -o program -lfl
main.o: main.c main.o: main.c
@ -21,6 +21,19 @@ lex.yy.o: lex.yy.c
lex.yy.c: ./scanner.l lex.yy.c: ./scanner.l
flex scanner.l flex scanner.l
.PHONY: clean .PHONY: clean test
clean: clean:
rm parser.tab.c parser.tab.h parser.tab.o lex.yy.o lex.yy.c program main.o node.o 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: Program:
ExtDefList { ExtDefList {
pNode children[1] = { $1 }; pNode children[1] = { $1 };
$$ = newNode(Program, yylineno, 1, children, nullValue()); $$ = newNode(Program, $1->line, 1, children, nullValue());
root = $$; root = $$;
} }
; ;
ExtDefList: ExtDefList:
ExtDef ExtDefList { ExtDef ExtDefList {
pNode children[2] = { $1, $2 }; pNode children[2] = { $1, $2 };
$$ = newNode(ExtDefList, yylineno, 2, children, nullValue()); $$ = newNode(ExtDefList, $1->line, 2, children, nullValue());
} }
| { | {
$$ = newNode(ExtDefList, -1, 0, NULL, nullValue()); $$ = newNode(ExtDefList, -1, 0, NULL, nullValue());
@ -38,25 +38,25 @@ ExtDefList:
ExtDef: ExtDef:
Specifier ExtDecList SEMI { Specifier ExtDecList SEMI {
pNode children[3] = { $1, $2, $3 }; pNode children[3] = { $1, $2, $3 };
$$ = newNode(ExtDef, yylineno, 3, children, nullValue()); $$ = newNode(ExtDef, $1->line, 3, children, nullValue());
} }
| Specifier SEMI { | Specifier SEMI {
pNode children[2] = { $1, $2 }; pNode children[2] = { $1, $2 };
$$ = newNode(ExtDef, yylineno, 2, children, nullValue()); $$ = newNode(ExtDef, $1->line, 2, children, nullValue());
} }
| Specifier FunDec CompSt { | Specifier FunDec CompSt {
pNode children[3] = { $1, $2, $3 }; pNode children[3] = { $1, $2, $3 };
$$ = newNode(ExtDef, yylineno, 3, children, nullValue()); $$ = newNode(ExtDef, $1->line, 3, children, nullValue());
} }
; ;
ExtDecList: ExtDecList:
VarDec { VarDec {
pNode children[1] = { $1 }; pNode children[1] = { $1 };
$$ = newNode(ExtDecList, yylineno, 1, children, nullValue()); $$ = newNode(ExtDecList, $1->line, 1, children, nullValue());
} }
| VarDec COMMA ExtDecList { | VarDec COMMA ExtDecList {
pNode children[3] = { $1, $2, $3 }; 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: Specifier:
TYPE_INT { TYPE_INT {
pNode children[1] = { $1 }; pNode children[1] = { $1 };
$$ = newNode(Specifier, yylineno, 1, children, nullValue()); $$ = newNode(Specifier, $1->line, 1, children, nullValue());
} }
| TYPE_FLOAT { | TYPE_FLOAT {
pNode children[1] = { $1 }; pNode children[1] = { $1 };
$$ = newNode(Specifier, yylineno, 1, children, nullValue()); $$ = newNode(Specifier, $1->line, 1, children, nullValue());
} }
| StructSpecifier { | StructSpecifier {
pNode children[1] = { $1 }; pNode children[1] = { $1 };
$$ = newNode(Specifier, yylineno, 1, children, nullValue()); $$ = newNode(Specifier, $1->line, 1, children, nullValue());
} }
; ;
StructSpecifier: StructSpecifier:
STRUCT OptTag LC DefList RC { STRUCT OptTag LC DefList RC {
pNode children[5] = { $1, $2, $3, $4, $5 }; pNode children[5] = { $1, $2, $3, $4, $5 };
$$ = newNode(StructSpecifier, yylineno, 5, children, nullValue()); $$ = newNode(StructSpecifier, $1->line, 5, children, nullValue());
} }
| STRUCT Tag { | STRUCT Tag {
pNode children[2] = { $1, $2 }; pNode children[2] = { $1, $2 };
$$ = newNode(StructSpecifier, yylineno, 2, children, nullValue()); $$ = newNode(StructSpecifier, $1->line, 2, children, nullValue());
} }
; ;
OptTag: OptTag:
ID { ID {
pNode children[1] = { $1 }; pNode children[1] = { $1 };
$$ = newNode(OptTag, yylineno, 1, children, nullValue()); $$ = newNode(OptTag, $1->line, 1, children, nullValue());
} }
| { | {
$$ = newNode(OptTag, -1, 0, NULL, nullValue()); $$ = newNode(OptTag, -1, 0, NULL, nullValue());
@ -97,7 +97,7 @@ OptTag:
Tag: Tag:
ID { ID {
pNode children[1] = { $1 }; pNode children[1] = { $1 };
$$ = newNode(Tag, yylineno, 1, children, nullValue()); $$ = newNode(Tag, $1->line, 1, children, nullValue());
} }
; ;
@ -105,37 +105,37 @@ Tag:
VarDec: VarDec:
ID { ID {
pNode children[1] = { $1 }; pNode children[1] = { $1 };
$$ = newNode(VarDec, yylineno, 1, children, nullValue()); $$ = newNode(VarDec, $1->line, 1, children, nullValue());
} }
| VarDec LB INTEGER RB { | VarDec LB INTEGER RB {
pNode children[4] = { $1, $2, $3, $4 }; pNode children[4] = { $1, $2, $3, $4 };
$$ = newNode(VarDec, yylineno, 4, children, nullValue()); $$ = newNode(VarDec, $1->line, 4, children, nullValue());
} }
; ;
FunDec: FunDec:
ID LP VarList RP { ID LP VarList RP {
pNode children[4] = { $1, $2, $3, $4 }; pNode children[4] = { $1, $2, $3, $4 };
$$ = newNode(FunDec, yylineno, 4, children, nullValue()); $$ = newNode(FunDec, $1->line, 4, children, nullValue());
} }
| ID LP RP { | ID LP RP {
pNode children[3] = { $1, $2, $3 }; pNode children[3] = { $1, $2, $3 };
$$ = newNode(FunDec, yylineno, 3, children, nullValue()); $$ = newNode(FunDec, $1->line, 3, children, nullValue());
} }
; ;
VarList: VarList:
ParamDec COMMA VarList { ParamDec COMMA VarList {
pNode children[3] = { $1, $2, $3 }; pNode children[3] = { $1, $2, $3 };
$$ = newNode(VarList, yylineno, 3, children, nullValue()); $$ = newNode(VarList, $1->line, 3, children, nullValue());
} }
| ParamDec { | ParamDec {
pNode children[1] = { $1 }; pNode children[1] = { $1 };
$$ = newNode(VarList, yylineno, 1, children, nullValue()); $$ = newNode(VarList, $1->line, 1, children, nullValue());
} }
; ;
ParamDec: ParamDec:
Specifier VarDec { Specifier VarDec {
pNode children[1] = { $1 }; pNode children[1] = { $1 };
$$ = newNode(ParamDec, yylineno, 1, children, nullValue()); $$ = newNode(ParamDec, $1->line, 1, children, nullValue());
} }
; ;
@ -143,13 +143,13 @@ ParamDec:
CompSt: CompSt:
LC DefList StmtList RC { LC DefList StmtList RC {
pNode children[4] = { $1, $2, $3, $4 }; pNode children[4] = { $1, $2, $3, $4 };
$$ = newNode(CompSt, yylineno, 4, children, nullValue()); $$ = newNode(CompSt, $1->line, 4, children, nullValue());
} }
; ;
StmtList: StmtList:
Stmt StmtList { Stmt StmtList {
pNode children[2] = { $1, $2 }; pNode children[2] = { $1, $2 };
$$ = newNode(StmtList, yylineno, 2, children, nullValue()); $$ = newNode(StmtList, $1->line, 2, children, nullValue());
} }
| { | {
$$ = newNode(StmtList, -1, 0, NULL, nullValue()); $$ = newNode(StmtList, -1, 0, NULL, nullValue());
@ -158,27 +158,27 @@ StmtList:
Stmt: Stmt:
Exp SEMI { Exp SEMI {
pNode children[2] = { $1, $2 }; pNode children[2] = { $1, $2 };
$$ = newNode(Stmt, yylineno, 2, children, nullValue()); $$ = newNode(Stmt, $1->line, 2, children, nullValue());
} }
| CompSt { | CompSt {
pNode children[1] = { $1 }; pNode children[1] = { $1 };
$$ = newNode(Stmt, yylineno, 1, children, nullValue()); $$ = newNode(Stmt, $1->line, 1, children, nullValue());
} }
| RETURN Exp SEMI { | RETURN Exp SEMI {
pNode children[3] = { $1, $2, $3 }; pNode children[3] = { $1, $2, $3 };
$$ = newNode(Stmt, yylineno, 3, children, nullValue()); $$ = newNode(Stmt, $1->line, 3, children, nullValue());
} }
| IF LP Exp RP Stmt { | IF LP Exp RP Stmt {
pNode children[5] = { $1, $2, $3, $4, $5 }; 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 { | IF LP Exp RP Stmt ELSE Stmt {
pNode children[7] = { $1, $2, $3, $4, $5, $6, $7 }; 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 { | WHILE LP Exp RP Stmt {
pNode children[5] = { $1, $2, $3, $4, $5 }; pNode children[5] = { $1, $2, $3, $4, $5 };
$$ = newNode(Stmt, yylineno, 5, children, nullValue()); $$ = newNode(Stmt, $1->line, 5, children, nullValue());
} }
| error SEMI | error SEMI
; ;
@ -187,7 +187,7 @@ Stmt:
DefList: DefList:
Def DefList { Def DefList {
pNode children[2] = { $1, $2 }; pNode children[2] = { $1, $2 };
$$ = newNode(DefList, yylineno, 2, children, nullValue()); $$ = newNode(DefList, $1->line, 2, children, nullValue());
} }
| { | {
$$ = newNode(DefList, -1, 0, NULL, nullValue()); $$ = newNode(DefList, -1, 0, NULL, nullValue());
@ -196,27 +196,27 @@ DefList:
Def: Def:
Specifier DecList SEMI { Specifier DecList SEMI {
pNode children[3] = { $1, $2, $3 }; pNode children[3] = { $1, $2, $3 };
$$ = newNode(Def, yylineno, 3, children, nullValue()); $$ = newNode(Def, $1->line, 3, children, nullValue());
} }
; ;
DecList: DecList:
Dec { Dec {
pNode children[1] = { $1 }; pNode children[1] = { $1 };
$$ = newNode(DecList, yylineno, 1, children, nullValue()); $$ = newNode(DecList, $1->line, 1, children, nullValue());
} }
| Dec COMMA DecList { | Dec COMMA DecList {
pNode children[3] = { $1, $2, $3 }; pNode children[3] = { $1, $2, $3 };
$$ = newNode(DecList, yylineno, 3, children, nullValue()); $$ = newNode(DecList, $1->line, 3, children, nullValue());
} }
; ;
Dec: Dec:
VarDec { VarDec {
pNode children[1] = { $1 }; pNode children[1] = { $1 };
$$ = newNode(Dec, yylineno, 1, children, nullValue()); $$ = newNode(Dec, $1->line, 1, children, nullValue());
} }
| VarDec ASSIGNOP Exp { | VarDec ASSIGNOP Exp {
pNode children[3] = { $1, $2, $3 }; 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:
Exp ASSIGNOP Exp { Exp ASSIGNOP Exp {
pNode children[3] = { $1, $2, $3 }; pNode children[3] = { $1, $2, $3 };
$$ = newNode(Exp, yylineno, 3, children, nullValue()); $$ = newNode(Exp, $1->line, 3, children, nullValue());
} }
| Exp AND Exp { | Exp AND Exp {
pNode children[3] = { $1, $2, $3 }; pNode children[3] = { $1, $2, $3 };
$$ = newNode(Exp, yylineno, 3, children, nullValue()); $$ = newNode(Exp, $1->line, 3, children, nullValue());
} }
| Exp OR Exp { | Exp OR Exp {
pNode children[3] = { $1, $2, $3 }; pNode children[3] = { $1, $2, $3 };
$$ = newNode(Exp, yylineno, 3, children, nullValue()); $$ = newNode(Exp, $1->line, 3, children, nullValue());
} }
| Exp PLUS Exp { | Exp PLUS Exp {
pNode children[3] = { $1, $2, $3 }; pNode children[3] = { $1, $2, $3 };
$$ = newNode(Exp, yylineno, 3, children, nullValue()); $$ = newNode(Exp, $1->line, 3, children, nullValue());
} }
| Exp MINUS Exp { | Exp MINUS Exp {
pNode children[3] = { $1, $2, $3 }; pNode children[3] = { $1, $2, $3 };
$$ = newNode(Exp, yylineno, 3, children, nullValue()); $$ = newNode(Exp, $1->line, 3, children, nullValue());
} }
| Exp TIMES Exp { | Exp TIMES Exp {
pNode children[3] = { $1, $2, $3 }; pNode children[3] = { $1, $2, $3 };
$$ = newNode(Exp, yylineno, 3, children, nullValue()); $$ = newNode(Exp, $1->line, 3, children, nullValue());
} }
| Exp DIV Exp { | Exp DIV Exp {
pNode children[3] = { $1, $2, $3 }; pNode children[3] = { $1, $2, $3 };
$$ = newNode(Exp, yylineno, 3, children, nullValue()); $$ = newNode(Exp, $1->line, 3, children, nullValue());
} }
| LP Exp RP { | LP Exp RP {
pNode children[3] = { $1, $2, $3 }; pNode children[3] = { $1, $2, $3 };
$$ = newNode(Exp, yylineno, 3, children, nullValue()); $$ = newNode(Exp, $1->line, 3, children, nullValue());
} }
| MINUS Exp { | MINUS Exp {
pNode children[2] = { $1, $2 }; pNode children[2] = { $1, $2 };
$$ = newNode(Exp, yylineno, 2, children, nullValue()); $$ = newNode(Exp, $1->line, 2, children, nullValue());
} }
| NOT Exp { | NOT Exp {
pNode children[2] = { $1, $2 }; pNode children[2] = { $1, $2 };
$$ = newNode(Exp, yylineno, 2, children, nullValue()); $$ = newNode(Exp, $1->line, 2, children, nullValue());
} }
| ID LP Args RP { | ID LP Args RP {
pNode children[4] = { $1, $2, $3, $4 }; pNode children[4] = { $1, $2, $3, $4 };
$$ = newNode(Exp, yylineno, 4, children, nullValue()); $$ = newNode(Exp, $1->line, 4, children, nullValue());
} }
| ID LP RP { | ID LP RP {
pNode children[3] = { $1, $2, $3 }; pNode children[3] = { $1, $2, $3 };
$$ = newNode(Exp, yylineno, 3, children, nullValue()); $$ = newNode(Exp, $1->line, 3, children, nullValue());
} }
| Exp LB Exp RB { | Exp LB Exp RB {
pNode children[4] = { $1, $2, $3, $4 }; pNode children[4] = { $1, $2, $3, $4 };
$$ = newNode(Exp, yylineno, 4, children, nullValue()); $$ = newNode(Exp, $1->line, 4, children, nullValue());
} }
| Exp DOT ID { | Exp DOT ID {
pNode children[3] = { $1, $2, $3 }; pNode children[3] = { $1, $2, $3 };
$$ = newNode(Exp, yylineno, 3, children, nullValue()); $$ = newNode(Exp, $1->line, 3, children, nullValue());
} }
| ID { | ID {
pNode children[1] = { $1 }; pNode children[1] = { $1 };
$$ = newNode(Exp, yylineno, 1, children, nullValue()); $$ = newNode(Exp, $1->line, 1, children, nullValue());
} }
| INTEGER { | INTEGER {
pNode children[1] = { $1 }; pNode children[1] = { $1 };
$$ = newNode(Exp, yylineno, 1, children, nullValue()); $$ = newNode(Exp, $1->line, 1, children, nullValue());
} }
| FLOAT { | FLOAT {
pNode children[1] = { $1 }; pNode children[1] = { $1 };
$$ = newNode(Exp, yylineno, 1, children, nullValue()); $$ = newNode(Exp, $1->line, 1, children, nullValue());
} }
; ;
Args: Args:
Exp COMMA Args { Exp COMMA Args {
pNode children[3] = { $1, $2, $3 }; pNode children[3] = { $1, $2, $3 };
$$ = newNode(Args, yylineno, 3, children, nullValue()); $$ = newNode(Args, $1->line, 3, children, nullValue());
} }
| Exp { | Exp {
pNode children[1] = { $1 }; 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; errors += 1;
fprintf(stderr, "Error type A at Line %d: Mysterious character \"%s\".\n", yylineno, yytext); 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;
}