【问题标题】:flex/bison always has "syntax error in line 1"flex/bison 总是有“第 1 行的语法错误”
【发布时间】:2013-03-19 15:28:26
【问题描述】:

正如我在标题中所述,我正在尝试使用 flex 和 bison 编写解析器。但是,无论我如何修改文件,总是出现“第1行语法错误”的错误。

所以我决定写一个很简单的例子,看看我的方法对不对。

这是一个简单的文件“c1.isc”,将被读取:

1 nand
2 nor
3 nand
4 nor
5 xor

这是 token.l 文件:

%{
# include <stdio.h>
# include <string.h>
# include "parse.tab.h"


struct{
    char *symbol;
    int val;
} symtab[]={
"nand", 1,
"nor", 2,
"xor", 3,
"0",0
};

extern int yylval;

%}

DIGITS [0-9]+
BLANK [ \t\n]+
ALPHA [a-z]+

%%

{DIGITS} {yylval=atoi(yytext);return(NUM);}
{ALPHA} {yylval=lookup(yytext);return(TYPE);}
{BLANK} ;

%%
lookup(s)
char* s;
{int i;
for (i=0;symtab[i].val!=0;i++)
{
if(strcmp(symtab[i].symbol,s)==0)
break;
}
return(symtab[i].val);
}

这是 parse.y 文件

%{
# include <stdio.h>


extern FILE *yyin;

int gi;


%}

%token NUM TYPE

%%

parto: NUM
       {gi=$1;printf("num=%d\t",gi);}
       TYPE
       {gi=$3;printf("type=%d\n",gi);}
       ;

%%

yyerror(s)
char *s;
{
    extern int yylineno;
    extern char yytext[];

    fprintf(stderr, "%s in line %d near <%s>\n", s, yylineno, yytext);
    exit(-1);
}

main()
{FILE *x=fopen("c1.isc","r");
 yyin=x;
 yyparse();
} 

我认为这几乎是最简单的示例,但解析器仍然只将第一行输出为“num=1 gat=1”,然后输出“第 1 行附近的语法错误”。

我真的不知道为什么。我确定令牌文件是正确的,因为我已经使用以下方式对其进行了测试:

%{
# include <stdio.h>
# include <string.h>


struct{
    char *symbol;
    int val;
} symtab[]={
"nand", 1,
"nor", 2,
"xor", 3,
"0",0
};

int val;

%}

DIGITS [0-9]+
BLANK [ \t\n]+
ALPHA [a-z]+

%%

{DIGITS} {val=atoi(yytext);printf("num=%d\t",val);}
{ALPHA} {val=lookup(yytext);printf("type=%d\n",val);}
{BLANK} ;

%%
lookup(s)
char* s;
{int i;
for (i=0;symtab[i].val!=0;i++)
{
if(strcmp(symtab[i].symbol,s)==0)
break;
}
return(symtab[i].val);
}

main()
{
FILE *x=fopen("c1.isc","r");
yyin=x;
yylex();
}

而且 yylex() 可以工作。

我的编译方式是 1. 弹性令牌.l 2.野牛-d parse.y 3. cc lex.yy.c parse.tab.c -lfl

然后我会得到a.out,当我运行a.out时,就会出现错误。

我猜那是因为我在 parse.y 文件中的规则不正确,但错误怎么总是出现在第一行?

我已使用以下规则使其工作。

parti: 
     | parti parto
     ;

parto: NUM
       {gi=$1;printf("num=%d\t",gi);}
       TYPE
       {gi=$3;printf("type=%d\n",gi);}
       ;

【问题讨论】:

  • 请注意正确标记问题。 Flex 标签用于 Adob​​e/Apache UI 框架。 gnu-flex 用于词法分析器。
  • 感谢您帮助我使用正确的标签!

标签: syntax-error bison flex-lexer


【解决方案1】:

也许我在这里遗漏了一些东西,但你的语法只说输入应该是一个 NUM 和一个 TYPE。就这样。因此,当解析器找到更多内容时,您会在输入的第二行收到错误。

您必须添加一个处理多行的规则。像这样的:

lots_of_partos: parto lots_of_partos | /* empty */ ;

【讨论】:

  • 感谢您的回答。我认为你是对的,因为我在第一行输出之后就得到了错误。那我试试看。
  • @Micael:是的,你需要一个递归规则。我编辑了答案并添加了一个示例。
  • 谢谢,托马斯。我已经使用规则使其工作。我在问题的最后给出了规则。
  • 但是你介意看看我项目中的问题吗?谢谢! stackoverflow.com/questions/15510101/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-21
  • 2018-04-25
  • 1970-01-01
  • 2017-09-28
相关资源
最近更新 更多