2016-10-12 10 views
0

LACファイルに定義されていないすべての記号に対してYACCが構文エラーを報告する可能性があるかどうか疑問に思っていました。Yacc/Lex:拒否記号が定義されていません

例:

レックス

/*dummy.y*/ 
%token INT ID NUM 

%% 
var : INT ID "=" NUM ";" 
%% 

int main(void) { 
    yyparse(); 
} 

とき

私のプログラムは、構文エラーを報告しますように私はそれを作るのですか、私はこれらの2つのファイルを持っていると言うファイル

/*dummy.l*/ 
%{ 
#include "dummy.tab.h" 

%% 

int return INT; 
[a-z]+ return ID; 
[0-9]+ return NUM; 

%% 

Yaccのファイル入力に$(ドル記号)が表示されます。

例:それでも入力時に受け入れます。

int a = 234; $

注:私は、あなたはトークンのいくつかの種類として、すべての入力テキストを認識するためのlexルールを追加する必要があります定義さ

答えて

1

されていないすべてのシンボルを拒否したいです。通常、私は次のものを使用します:

.|\n return *yytext; 

をlexファイルの最後のパターンとして使用します。これにより、入力がlexのデフォルトのECHOアクションを引き起こさないことが保証されます。 \ n(無視するなど)のルールがもう1つある場合は、\nは必要ありません。

yaccファイルで"="(二重引用符)を使用すると、1つのリテラル文字に一致するように'='(一重引用符)を使用したいと思っています。

+0

Ahh私は –

+0

'を使って試しました。 ;ルールは、私はあなたの答えに応じて、デフォルトのECHOアクションを引き起こした空のアクションを残しました。今は完璧に動作します。あなたの時間をありがとうございました。 –

関連する問題