iは

2017-12-27 9 views
0
"lexicale.l", line 13: unrecognized rule 
"lexicale.l", line 13: unrecognized rule 

線13はiは

{idf} {printf("indetificateur\n");} 

コードでエラー認識できないルールの解決策を見つけることができませんです。

%{ 
    #include "stdio.h" 
    #include "stdlib.h" 
%} 
int [0-9]+ 
float [0-9]+("."[0-9]+)* 
bool 0 | 1 
idf [A-Z] ([0-9a-zA-Z] (_)? [0-9a-zA-Z]) {0,11} 
%% 
{int} {printf("int\n");} 
{float} {printf("float\n");} 
{bool} {printf("bool\n");} 
{idf} {printf("indetificateur\n");} 
.  {printf("erreur\n");} 

答えて

1

(F)LEXパターンは引用符で囲まれていない空白文字を含めることはできません。

定義boolと定義idfには、引用符で囲まれていない空白が含まれています。両方の定義から空白を削除する必要があります。

flexは独自の入力ファイルを解析する方法が奇抜であるため、パターン定義の構文エラーについて報告された行番号はあまり正確ではありません。特に、定義が展開されたときにエラーが報告され、定義されていないときには報告されません。また、この場合のように、誤った定義を展開した後の行でエラーが報告されることがよくあります。

全体として、私は個人的には定義が役に立たないと感じます。ほとんどの場合(このような)明らかな利点はなく、実装の不思議さは混乱や予期しない結果を招く可能性があります。

あなたはフレックス使用している、とあなたはパターンで空白を使用する場合は、「拡張構文」フラグを設定する(?x:…)でパターンを囲むことができます:ところで

idf (?x: [A-Z] ([0-9a-zA-Z] (_)? [0-9a-zA-Z]) {0,11}) 

を、あなたのboolパターン0 | 1単純に[01]と書かれています。ただし、intルールが0または1と一致するため、ルールの前にルールが配置されていないと認識されず、ファイルの前に表示されます。 (それは重要ではなく定義であるの規則の順序です。これは、不必要な定義の使用に起因する別の混乱の可能性があります)