【问题标题】:I'm receiving an error when giving my language a second input为我的语言提供第二次输入时收到错误消息
【发布时间】:2014-11-06 09:49:04
【问题描述】:

从我的 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);
}

感谢您的任何意见!

【问题讨论】:

  • 语法需要换行符。
  • @BLUEPIXY:我在我的 .l flex 文件中将其作为正则表达式 [ \t\n] {;}
  • 你应该使用 flex-lexer 标签而不是 flex。我已经为你编辑了这个。

标签: c bison yacc flex-lexer lex


【解决方案1】:

你的 yacc 语法只声明一行。完成一行后,任何以下输入都是语法错误。

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

lines : line
      | lines line
      ;

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

【讨论】:

    猜你喜欢
    • 2017-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-18
    • 1970-01-01
    • 2015-01-25
    相关资源
    最近更新 更多