2013-03-03 59 views
0

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本身的关键字。 表达“初始”部分句法结构的方法已经过测试。输入:语法错误 失败! 输出我的完整程序: zhou:318.19-318.25:语法错误,意外$ end,期待CHANGE或STEADY或INITIAL

如何解决这样的问题?

回答

0

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

没有必要为您的终端符号(INITIAL),以恰好等于它的语法("initial"),所以只是将其重命名,例如作为TOK_INITIAL。如果你想的错误信息更清晰(为什么你的用户了解TOK_INITIAL的意思吗?),使用此:

%token TOK_INITIAL "initial" 
+0

实际上,“initial”是EDIF(电子设计交换格式)的关键字,它有它自己的语法,我什么都不能改变。非常感谢您的建议。 – zhou 2013-03-03 12:00:55

+0

真的,我不是建议更改关键字的语法,而是用来操纵它的名称。粗略地说,我并不是建议改变π的值,而是使用'PI'作为名称。 – akim 2013-03-04 12:39:34

1

如果使用%令牌TOK_INITIAL“初始”是指在“初始”也做了改变{返回TOK_INITIAL;}然后它会正常工作。

也看这个。

如果在解析器启动时需要初始化某些东西,可以使用%initial-action {some-code}来告诉野牛在yyparse开头附近复制某些代码。代码复制的地方在标准初始化代码之后,所以你不能在代码中有用地放置变量声明。 (他们将被接受,但他们不会在你的行为中被访问。)如果你需要定义你自己的分析时变量,你必须使用静态全局变量或者通过%parse-param作为参数传递它们。