2014-03-12 55 views
0

我想解析代碼,並且爲此我寫了LEX和YACC文件,它將在下面給出。第一行它正確讀取,但之後,它給語法錯誤,它不讀下一行,我應該修改輸入和輸出函數,我正在從文件讀取和寫入我的輸出在一個文件.....我只是開始使用LEX YACC,需要一些想法。在LEX中讀取新行給出語法錯誤YACC

輸入文件

b_7 = _6 + b_3; 
a_8 = b_7 - c_5; 

法文件

%{ 
     /* 
      parser for ssa; 
     */ 

    #include<stdio.h> 
    #include<stdlib.h> 
    #include"y.tab.h" 


    %} 
    %% 
    [\t]+ ; 
    \n ; 



    [if]+  printf("first input\n"); 
    [else]+  return(op); 
    [=]+  return(equal); 
    [+]+  return(op); 
    [*]+  return(op); 
    [-]+  return(op); 

    [\<][b][b][ ]+[1-9][\>] {return(bblock);} 

    ([[_][a-z]])|([a-z][_][0-9]+)|([0-9]+) {return(var);} 

    . ; 




    %% 

YACC文件

%{ 
/* lexer for ssa gramer to use for recognizing operations*/ 
#include<stdio.h> 
char add_graph(char,char,...); 

%} 

%token opif opelse equal op bblock var 

%% 

sentence: var equal var op var { add_graph($1,$2,$3,$4,$5);} 

    ; 


%% 
extern FILE *yyin; 
main(argc,argv) 
int argc; 
char **argv; 
{ 
    if(argc > 1) { 
     FILE *file; 
     file=fopen(argv[1],"r"); 
     if(file==NULL) { 
      fprintf(stderr,"couldnot open%s\n",argv[0]); 
      exit(1); 
     } 
     yyin=file; 
    } 
     do 
    { 
    yyparse(); 
    }while (!feof(yyin)); 
fclose(yyin); 
} 
char add_graph(something) 
{ 
..... 
..... 
} 

yyerror(s) 
char *s; 
{ 
    fprintf(stderr,"%s there is error\n",s); 
} 
yywrap() 
{ 
printf("the output"); 
} 

回答

0

你的語法只允許一個sentence。所以如果第一句話後有任何輸入,就會出現錯誤。你想要允許一個或多個句子。在.Y文件試試這個:

%% 
sentences : sentences sentence 
      | sentence 
      ; 
sentence : var equal var op var { add_graph($1,$2,$3,$4,$5);} 
      ; 
%% 
+0

是的大衛,我已經寫你的代碼,我已經添加了一個更多的行文件克里克告訴和它的作品「;」 ; – user2987223

1

很多問題在這裏:

  • 你的語法期待令牌op,但你的詞法分析器絕不會產生它,而不是產生opaddopmul
  • 您的示例在行尾有;,但您的詞法分析器和分析器都不處理它們。複製到標準輸出的默認詞法分析器動作幾乎從未如你所願。
  • 您的yacc文件嘗試使用\\作爲某種評論標記,但yacc不理解這一點。 YACC的某些版本瞭解C++ - 風格//作爲註釋,但不是所有的
  • 你的語法只允許一個句子中輸入
  • 你的句子有在最後一個虛假op(下一行),這是不是一個單獨的句子規則 - 你需要|分開規則。
  • 如果您在yyparse返回時未嘗試循環,則嘗試循環,但如果出現錯誤,則可能是輸入仍然存在一些會導致立即錯誤的錯誤,從而導致錯誤風暴 - 可能不是你想要的。
+0

是的,有一些錯誤,我現在編輯。 – user2987223

-1

DAVID是在說正確的,但ONE MORE改性需要做

ADD

";"  ; 

看看這CAN HELP.acknowledge我,如果我錯了。