flex& bison中的“初始”处理

时间:2013-03-03 04:05:02

标签: bison

working initial.l

%{
 #include "initial.tab.h"
%}

%%
”initial” {return INITIAL;}
[()] {return yytext[0];}
.
%%
int yywrap(void)
{
 return(1);
}

工作initial.y

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

  #define YYDEBUG 1
  char *filename;
  FILE *fp; 
%}
%token INITIAL

%%
initial:'(' INITIAL ')'
;
%%

main(argc,argv)
int argc;
char **argv; 
{
extern   FILE*   yyin; 
if (argc >1 && !strcmp(argv[1],"-d"))
{
 yydebug =1;
 argc--;
 argv++;
}
 if(argc >1 )
  {
   if((yyin = fopen(argv[1],"r"))==NULL)
     {perror(argv[1]);
      exit(1);
     }
   filename=argv[1];
 }  
  else
   filename="(stdin)" ;

if(!yyparse())
  printf("Done!\n");
    else 
       printf("Fail!\n");

}

数据文件:(初始)

这两个程序是我程序的一部分。单词“initial”是在initial.l中定义的关键字,但似乎它也是flex本身的关键字。 表达“初始”部分句法结构的方法已经过测试。 输出:语法错误            失败! 出完整个程序:      周:318.19-318.25:语法错误,意外$结束,期待更改或稳定或初始

如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

如果你使用%token TOK_INITIAL&#34; initial&#34;也意味着在“初始”中进行了更改{return TOK_INITIAL;}然后它会正常工作。

同样看这个。

如果您需要在解析器启动时初始化某些内容,可以使用%initial-action {some-code}告诉bison在yyparse开头附近复制某些代码。复制代码的位置在标准初始化代码之后,因此您无法在代码中有用地放置变量声明。 (它们将被接受,但在您的操作中将无法访问它们。)如果您需要定义自己的分析时变量,则必须使用静态全局变量或通过%parse-param将它们作为参数传递。 /强>

答案 1 :(得分:0)

确实INITIAL是由Flex定义的(作为宏),所以不要使用此名称,就像EOF和其他宏一样。

您的终端符号(INITIAL)不需要与其语法("initial")完全相同,因此只需重命名它,例如TOK_INITIAL。如果您希望错误消息更清晰(为什么您的用户会理解TOK_INITIAL的含义?),请使用:

%token TOK_INITIAL "initial"