2014-03-12 32 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我,如果我错了。