0

工作初始.l

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

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

工作初始.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本身的关键字。表达“初始”部分句法结构的方式已经过正确测试。输出:语法错误失败!输出我的完整程序:zhou:318.19-318.25:syntax error, unexpected $end, expecting CHANGE or STEADY or INITIAL

如何解决这样的问题?

4

2 回答 2

1

如果你使用 %token TOK_INITIAL "initial" 意味着在 "initial" {return TOK_INITIAL;} 中也进行了更改,那么它会正常工作。

也在看这个。

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

于 2013-12-19T06:01:03.020 回答
0

IndeedINITIAL由 Flex 定义(作为宏),所以不要使用这个名称,就像EOF和其他宏一样。

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

%token TOK_INITIAL "initial"
于 2013-03-03T08:07:05.113 回答