大学でのコンプライアンス技術コースを開始する前に、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;
}
ええ、最初の仕事はフレックスだけを使ってやっていたのですが、2番目はflexですべての出力/入力を出してバイソンに入れていました。 提供されたmakeファイルを実行しただけで、警告が表示されませんでした。しかし今バイソンを走らせて、それは私にエラーを与える。私は彼らに対処しようとした後にチェックする。 フレックスパターンを拡張して改行をキャッチするにはどうすればよいですか?ちょうど別のルールを作る? –
@adam:あなたのフレックスパターンは問題ありませんが、修正するのは簡単ではありません。 bisonの問題は、入力全体を定義する必要があることです。 bisonはプログラムを解析するためのものです。あなたがinoutを分割するだけなら、それは必要ありません。フレックスはすでにそうしている。 – rici
ええと、オッケー。私は多分誤植を誤解していたかもしれません。 レクサーから印刷/出力を取り除き、行と改行のシーケンスを認識し、文法のアクションから各行のテキストを出力する簡単な文法を実装します。出力はエクササイズ1と同じに見えるはずですが、フレックス文法ではなくバイソン文法のアクションから来るはずです。 もう一度やってみよう! –