【发布时间】:2012-02-16 10:12:43
【问题描述】:
我曾尝试坐在这里阅读有关 YACC 如何处理 lex 文件的教程,但我不确定我是否能完全理解它。我知道这是为了读取实际的输入文件并确定加法或减法等函数的格式是否正确,但这是如何工作的?我了解 Lex 文件的工作原理,并构建了一个根据文件中遇到的内容返回定义变量的文件。
如果我有一个非常简单的程序,我将如何分析这种测试编程语言的第一行。假设“program”是 lex 中定义的值,以及“is”、“var”、“begin”、“+”、“print”、“;”、“”和“end”。
需要如何编写 yacc 文件才能读取前几行?
测试文件:
program xyz is
var a, b, c
begin
a = 2;
b = 3;
c = a + b;
print c
end
Yaccer.y
%token EOFNUM 0
%token SEMINUM 1
%token LPARENNUM 2
%token RPARENNUM 3
%token ICONSTNUM 4
%token BEGINNUM 5
%token PROGRAMNUM 6
%token MINUSNUM 7
%token TIMESNUM 8
%token VARNUM 9
%token COMMANUM 10
%token IDNUM 11
%token ENDNUM 12
%token ISNUM 13
%token PLUSNUM 14
%token DIVNUM 15
%token PRINTNUM 16
%token EQUALNUM 17
%left '+' '-'
%left '*' '/'
%%
%%
#include "lex.yy.c"
#include <stdio.h>
yyerror(str)
char *str;
{ printf("yyerror: %s at line %d\n", str, yyline); }
main () {
if (!yyparse()) { printf("accept\n");}
else { printf("reject\n"); }
}
我知道需要为方程式定义一些 %types,但是我不确定如何将这些类型与 %left 声明一起使用,或者即使这是正确的。我也对如何分析第一行感到困惑。
【问题讨论】: