【发布时间】:2015-07-24 13:55:33
【问题描述】:
我正在尝试创建一个简单的解析器/编译器,主要用于家庭作业,但最终也是为了学习和娱乐。我已经编写了词法分析器和解析器文件(用于命令的初始子集),并且我想输出一个 AST。但是,即使我试图解析一个简单的“1+1”,我也会遇到“语法错误”消息。这是词法分析器文件:
%{
#include "parser.tab.h"
%}
DIGIT [0-9]
LETTER [a-zA-Z]
%%
[ \t\n] ;
{DIGIT}+ {yylval = atoi(yytext); return NUMBER;}
{LETTER}* { if (strlen(yytext) <= 8){
printf( "<ID, %s> ", yytext );
} else {
yytext[8] = '\0';
printf("WARNING! Long identifier. Truncating to 8 chars\n");
printf( "<ID, %s> ", yytext );
}
}
"+" {printf("Found '+' symbol\n");return(PLUS);}
"-" return(MINUS);
"*" return(TIMES);
"/" return(DIVIDE);
"(" return(LEFT_PARENTHESIS);
")" return(RIGHT_PARENTHESIS);
<<EOF>> return(END_OF_FILE);
%%
int yywrap (void) {return 1;}
这里是解析器文件:
%{
#include <stdio.h>
/*#include "tree.h"
#include "treedefs.h"*/
int yylex();
#define YYSTYPE int
%}
%start program
%token NUMBER
%token ID
%token PLUS MINUS TIMES EQUAL
%token LEFT_PARENTHESIS RIGHT_PARENTHESIS
%token LET IN AND
%token END_OF_FILE
%left PLUS MINUS
%left TIMES DIVIDE
%%
program: /* empty */
| exp { printf("Result: %d\n", $1); }
| END_OF_FILE {printf("Encountered EOF\n");}
;
exp: NUMBER { $$ = $1;}
| exp PLUS exp { $$ = $1 + $3; }
| exp TIMES exp { $$ = $1 * $3; }
| '(' exp ')' { $$ = $2;}
;
%%
int yyerror (char *s) {fprintf (stderr, "%s\n", s);
}
另外,我创建了一个 main.c,以单独保留 main() 函数。您可以省略 tree*.h 文件,因为它们只包含与 AST 相关的函数。
#include <stdio.h>
#include <stdlib.h>
#include "tree.h"
#include "treedefs.h"
int main(int argc, char **argv){
yyparse();
TREE *RootNode = malloc(sizeof(TREE));
return 0;
}
我已经阅读了大量示例,但找不到与我所写内容(非常)不同的内容。我究竟做错了什么?任何帮助,将不胜感激。
【问题讨论】:
-
在解析器中,
'(' exp ')':用LEFT_PARENTHESIS和RIGHT_PARENTHESIS替换(和)。添加令牌DIVIDE并为它和MINUS添加规则。我没有看到其他错误。 - 使用调试器单步执行它以查看引发错误的位置。 -
谢谢,我已经更正了,但没有成功。尝试其他方式。
标签: c compiler-construction bison yacc lex