2017-08-17 10 views
0

編集:私は多項式を認識し、それらをプリントアウトするために起こっている簡単なコンパイラを書いてみましたYaccの/フレックス構文エラー

Polinomルールを変更しました。それは意図したように、多項式を出力した後に構文エラー書き込みを吐き出します。このような問題で私を悩ますものは、それがレクサーかパーサであるかどうかは分かりません。

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行のテキストファイルされる:<1, -3, 0, -1.3, 6>

+1

ファイルの1行に*改行*が付いていると思いますか?今、 'Program'のルールは、改行の後に何が起こるのでしょうか?おそらく、あなたは 'EOF'のためのトークンを追加し、それをパーサの規則に入れておくべきでしょうか? –

+0

ちょうど青になる:空間のフレックスルールに '\ r'を入れることに傷つけることはできない(つまり、[\ t]' - ['\ t \ r]')。これは少なくともWindows上で助けとなり、入力ファイルがバイナリモードで開かれた場合... – Scheff

+0

実際には、いいえ、私は改行とそれなしで試しました。>エラーはまだ同じです。 '\ r'でも試してみましたが、成功しませんでした。 – monolith937

答えて

0

どうやら、geditのはいつも最後に改行文字\nを追加そのファイルの。それを防ぐ方法がないと思われます。 parser.yppのPolinomに空のルールを追加することで、Polinomが改行になるのを許可することでその問題を回避します。