2017-04-15 7 views
0

私はflexとbisonを用いた小型のコンパイラを作るしようとしていますが、私はすべてのルールのアクションを与えることをどのようになっていなかったためにアクションを与える方法は、すべてのルールバイソン

私の文法は次のようである:

 %union{ 
      std::string *s; 
    }; 

%start program 
%type <s> expr 

%token <s> KEYWORD 
%token <s> VARIABLE 

%% 

program : KEYWORD {std::cout << "A"; } 
| KEYWORD VARIABLE {std::cout << "B"; } 

変数正規表現がある[a-zA-Z0-9]は

"キャップ" "キャップロック" と私はoutpuなっていた(キャップ​​= KEYWORDとロック= VARIABLE) を入力を与えた場合、私のキーワード

ですtを "B"として

私が次の単語を入力するまで待ってから次の単語を入力すると、次の入力が大文字であれば "Asyntaxエラー"が表示されます。

問題は、次の入力がAを印刷するために与えられ、エラーが、私は誰かがそれで間違いを見つけることができることと間違っているものを得ていないた構文エラー

で存在している場合、それはまだAを出力するまでそれが待機しています。

+1

これで、Aが印刷されますが、Bは印刷されません。つまり、あなたは物事をキーワードとして特定していますが、明らかに変数ではありません。問題は文法にはありません。それは字句解析ツールにあります。これはあなたが示していないものです。あなたの印刷に改行を加えることを考慮する必要があります。 (COBOLのように、変数名の文字として '-'を使用するのは珍しいですが、' Z'と '0'の間に' _ 'を意味しましたか?)あなたはレキシカルで診断印刷を有効にできることを確認しましたか?アナライザーはトークンストリームが文法に戻ってくるのを見ることができますか?あなたができるなら、それは長期的に人生を楽にします。 –

+0

フレックスで診断印刷を有効にする方法と字句解析ツールで何も印刷しない方法改行を追加する方法 –

+0

フレックスコードでコントロールを指定する必要があります。デフォルトでは提供されていません。しかし、レキシカルアナライザが何を返すかを見ることができると、しばしば文法のデバッグに役立ちます。 –

答えて

1

Bisonは、入力の終わりをマークして正常に解析を返すためには、「end of input」トークンが必要です。通常、EOFを読むときにこのトークンを与えます(これはlex/flexが行うものです)。あなたが入力した後(一般CTRLDまたはCTRLZを押すことで)EOFを入力したのであれば、それが動作するはずです。

+0

スペースと新しい行のような非マッチな入力をエコーするのを止めますか?スペースと改行のために使用され、他の一致していないASCII文字列には構文エラーが返されます。 –

+0

@ JeevansaiJinne:Bisonは比類のない入力のエコーをしません。これがFlexの「仕事」です。これは、他のルール( '。+ {ECHO;}')によって捕捉されなかった一致したテキストをエコーするデフォルトルールを持っています。 –

+0

bisonのスペースをプリントする方法は、アドレス –