2013-03-03 58 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作爲參數傳遞它們。