的Yacc /柔性语法错误

问题描述:

编辑:改变了Polinom规则的Yacc /柔性语法错误

我试着写一个简单的编译器,那将认识多项式并打印出来。尽管如此,正如预期的那样,它在打印出多项式后吐出语法错误写入。这些问题困扰我的是无法弄清楚它是导致所有大惊小怪的词法分析器还是解析器。

parser.ypp

%{ 

#include <iostream> 
#include <cstdlib> 
#include <cmath> 
#include <vector> 

using namespace std; 

extern int yylex(); 

void yyerror(string s) { 
    cerr << s << endl; 
    exit(EXIT_FAILURE); 
} 


%} 

%union { 
    double d; 
    vector<double> *niz; 
    } 

%token <d> num_token 
%type <niz> NizBrojeva 

%% 

Program: Program '\n' Polinom 
     | Polinom 
     ; 


Polinom: '<' NizBrojeva '>' { 
         vector<double>::iterator i; 
         int k = 0; 
         for(i = $2->begin(); i != $2->end(); i++, k++) { 
          if (*i == 0) 
           continue; 

          if (k == 0) { 
           cout << *i; 
           continue; 
          } 

          if (*i > 0) 
           cout << " + " << abs(*i) << "x"; 
          if (*i < 0) 
           cout << " - " << abs(*i) << "x"; 
          if (k != 1) 
           cout << "^" << k; 
         }  

         cout << endl;     

        } 
     | // <-------------------------------------------- That's all I added 
     ; 

NizBrojeva: NizBrojeva ',' num_token { $1->push_back($3); $$ = $1; } 
     | num_token   { $$ = new vector<double>(); $$->push_back($1); } 
     ; 



%% 


int main() { 
    yyparse(); 
    return 0; 
} 

lexer.l

%option noyywrap 
%option noinput 
%option nounput 

%{ 

#include <iostream> 
#include <vector> 
using namespace std; 

#include "parser.tab.hpp" 

%} 

DIGIT [0-9] 

%% 

([+|-])?{DIGIT}+(\.{DIGIT}*)?  { yylval.d = atof(yytext); return num_token; } 
[<>,\n]    { return *yytext; } 
[ \t]    { } 
.   { cerr << "Leksicka greska: neprepoznat karakter " << *yytext << endl; 
       exit(EXIT_FAILURE); 
       } 

%% 

试验的例子是其与一个行的文本文件:<1, -3, 0, -1.3, 6>

+1

让我猜测,文件中的单行有一个*换行符*之后?现在在换行之后发生什么'Program'的规则?也许你应该为'EOF'添加一个标记并在解析器规则中添加这个标记? –

+0

只是一个蓝色的问题:把'\ r'放入空间的flex规则(即'[\ t]' - >'[\ t \ r]')是不会伤害的。这至少可以帮助Windows,并且如果输入文件是以二进制模式打开的...... – Scheff

+0

其实,不,我尝试了换行符和没有它>错误仍然是相同的。也试着用'\ r'来试试,没有成功。 – monolith937

显然,gedit中总是在端添加一个新行字符\n其文件。似乎没有办法阻止这一点。在parser.ypp中为Polinom添加一个空规则,通过允许Polinom只是一个换行符来回避这个问题。