2017-01-15 4 views
0

大学でのコンプライアンス技術コースを開始する前に、flex、bisonに関するチュートリアルがあります。改行(FLEX、BISON)を除いた正規表現のマッチライン

次のテストは、これは何を私のパーサが出力すべきである線や改行

testtest test data 
second line in the data 
another line without a trailing newline 

に分割する必要があります。

cat test.txt | ./parser 

以下これを返す

Line: testtest test data 
NL 
Line: second line in the data 
NL 
Line: another line without a trailing newline 

イムランニング:

LINE: testtest test data 
It's a bad: syntax error 

これは私の.Yファイルにあります。

%{ 
    #include<stdio.h> 
    int yylex();   /* Supress C99 warning on OSX */ 
    extern char *yytext; /* Correct for Flex */ 
    unsigned int total; 

%} 
%token LINE 
%token NL 
%% 
line : LINE    {printf("LINE: %s\n", yytext);} 
     ; 
newline : NL    {printf("NL\n");} 
     ; 

そして、これは私のbinary.flexファイルである:だから

%top{ 
#define YYSTYPE int 
#include "binary.tab.h"   /* Token values generated by bison */ 
} 
%option noyywrap 
%% 
[^\n\r/]+ return LINE; 
\n   return NL;  
%% 

、この問題を解決するための任意のアイデア?

PS:これはバイソン文法は最初の非ターミナルを認識するため

#include<stdio.h> 
#include "binary.tab.h" 
extern unsigned int total; 

int yyerror(char *c) 
{ 
    printf("It's a bad: %s\n", c); 
    return 0; 
} 

int main(int argc, char **argv) 
{ 
    if(!yyparse()) 
    printf("It's a mario time: %d\n",total); 
    return 0; 
} 

答えて

1

あなたのバイソンの文法が正確に1つのLINE(改行なし)を認識し、私の.cファイルです。ちょうど、それ以上はありません。

LINEとおそらくはNLからなる複数の行を認識したい場合は、それぞれが...からなる複数の行からなる入力に対して定義を追加する必要があります。私は元の問題がちょうどフレックスで解決するのが容易だと思われるので、なぜあなたがバイソンを使うのかは分かりません。

ところで、あなたの入力ファイルに\r文字が含まれていると、あなたのフレックスパターンはそれを認識できません(フレックスで生成されたデフォルトルールがそれをキャッチしますが、それはほとんどあなたが望むものではありません)。 %option nodefaultを使用すると、この種のエラーに関する警告が表示されます。そしてあなたが警告を見ると反応します。あなたがあなたのバイソンファイルにバイソンを走らせたときにいくつか見たことがあります。

+0

ええ、最初の仕事はフレックスだけを使ってやっていたのですが、2番目はflexですべての出力/入力を出してバイソンに入れていました。 提供されたmakeファイルを実行しただけで、警告が表示されませんでした。しかし今バイソンを走らせて、それは私にエラーを与える。私は彼らに対処しようとした後にチェックする。 フレックスパターンを拡張して改行をキャッチするにはどうすればよいですか?ちょうど別のルールを作る? –

+0

@adam:あなたのフレックスパターンは問題ありませんが、修正するのは簡単ではありません。 bisonの問題は、入力全体を定義する必要があることです。 bisonはプログラムを解析するためのものです。あなたがinoutを分割するだけなら、それは必要ありません。フレックスはすでにそうしている。 – rici

+0

ええと、オッケー。私は多分誤植を誤解していたかもしれません。 レクサーから印刷/出力を取り除き、行と改行のシーケンスを認識し、文法のアクションから各行のテキストを出力する簡単な文法を実装します。出力はエクササイズ1と同じに見えるはずですが、フレックス文法ではなくバイソン文法のアクションから来るはずです。 もう一度やってみよう! –

関連する問題