给出一个简单非计算器语言的flex和bison文件示例
时间: 2024-05-15 17:14:07 浏览: 94
以下是一个简单的非计算器语言的flex和bison文件示例:
flex文件(lex.l):
```
%{
#include "y.tab.h"
%}
%%
[ \t]+ /* ignore whitespace */
[0-9]+ { yylval.num = atoi(yytext); return INTEGER; }
[a-zA-Z][a-zA-Z0-9]* { yylval.id = strdup(yytext); return IDENTIFIER; }
. { return yytext[0]; } /* return operators */
%%
int yywrap() {
return 1;
}
```
bison文件(yacc.y):
```
%{
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define YYSTYPE union { int num; char* id; }
extern FILE *yyin;
extern int yylex();
extern int yylineno;
%}
%token INTEGER IDENTIFIER
%%
program : statement
| program statement
;
statement : INTEGER '+' INTEGER { printf("%d\n", $1 + $3); }
| IDENTIFIER '=' INTEGER { printf("%s = %d\n", $1, $3); }
;
%%
int main(int argc, char** argv) {
if (argc < 2) {
printf("Usage: %s filename\n", argv[0]);
return 1;
}
FILE* f = fopen(argv[1], "r");
if (!f) {
perror("Cannot open file");
return 1;
}
yyin = f;
yyparse();
fclose(f);
return 0;
}
int yyerror(char* message) {
fprintf(stderr, "Error on line %d: %s\n", yylineno, message);
return 1;
}
```
这个示例实现了一个简单的语言,支持整数和赋值操作,并且可以打印出结果。您可以使用以下命令来编译和运行它:
```
flex lex.l
bison -dy yacc.y
gcc -o parser lex.yy.c y.tab.c
./parser input.txt
```
其中,input.txt 是您的测试文件。
阅读全文