我在给我的语言第二次输入时收到错误

时间:2014-11-06 09:49:05

标签: c bison yacc flex-lexer lex

从我的bison / flex文件生成的程序适用于第一个输入(第一次运行yyparse()),但是当我再次尝试运行它时会抛出错误。

例如:

chris@chris-Inspiron-1525:~/4850/hw$ ./calc
HORN 3+4*6-11+33*2 ?
=   82
HORN 1+1 ?
error: syntax error

基本上,命令存在于' HORN'和'?'

这是我的.y文件:

%{ 
#include <stdlib.h>
#include <stdio.h>
void yyerror(const char *str);


%}

%union 
{
    int ival; 
    float fval;
    char* word;
}
%start line
%type <word> wexp
%type <ival> iexp
%type <fval> fexp

%left PLUS MINUS
%left STAR DIV MOD
%left POW
%token GT
%token LT
%token ASGN
%token LP
%token RP
%token LB
%token RB
%token NOT
%token GTEQ
%token LTEQ
%token EQTO
%token NOTEQ
%token HORN
%token QMARK
%token <word> WORD
%token <fval> FLOAT
%token <ival> INTEGER


%%

line    : HORN wexp QMARK   {   printf("=\t%s\n", $2);  }
        | HORN iexp QMARK   {   printf("=\t%d\n", $2);  }
        | HORN fexp QMARK   {   printf("=\t%f\n", $2);  }
        ;

iexp    : iexp MINUS iexp   { $$ = $1 - $3;             }
        | iexp PLUS iexp    { $$ = $1 + $3;             }
        | iexp STAR iexp    { $$ = $1 * $3;             }
        | iexp DIV iexp     { $$ = $1 / $3;             }
        | INTEGER           { $$ = $1;                  }
        ;

fexp    : FLOAT             { $$ = $1;                  }
        ;

wexp    : WORD              { $$ = $1;                  }
        ;
%%


int main(){
     yyparse();
}

void yyerror(const char *str)
{
        printf("error: %s\n",str);
}

感谢您的任何意见!

1 个答案:

答案 0 :(得分:1)

您的yacc语法只声明一行。当您完成一行后,任何后续输入都是语法错误。

当前允许尽可能多行的方法是添加第一条规则:

lines : line
      | lines line
      ;

如果你正确地忽略了lex部分中的行尾......