2012-02-08 5 views
0

PLYに問題がありましたが、私はバイソンに同じ文法の断片を言い換えてみましたが、同様の問題が発生しました。これは私が何か間違っているかもしれないことを示唆している。文法が決定論的であるBisonが間違ったトークンと一致する

multiline: '{' EOL lines EOL multiline '}' 
     | 
     ; 

lines: lines ANYTHING EOL 
    | 
    ; 

document -> fragment? 
fragment -> { \n line* \n fragment? } 
line  -> [^\n]+ \n 

関連LEX線:

[{}] return *yytext; 
[^\n]+ return ANYTHING; 
\n  return EOL; 

関連バイソン線

文法断片の記号表現は、このようになります私が知っていることはLALR(1)であってもよいはずです(ただし、実際にはテーブルを構築しようとはしませんでした)。 "{\n\n}"のような文書はOKですが、multiline要素がネストされている文書(例えば"{\n\n{\n\n}}")はありません。レクサーは最後に"}}"を2つの'}'ではなくトークンとして表示します。

私は間違っていますか?

+0

あなたは '[^ {} \ n] +何かを返そうとしましたか? ' – wildplasser

+0

それはうまくいきますが、テキストを「行」に分割するという元の考えは、フィールドに非EOL文字を許可することでした。 – mistotebe

+1

それはあなたの '{}'をすべて食べるでしょうか? Lexは欲張りです:もし2つのパターンが現在の入力にマッチすれば、最も長いマッチが勝ちます。 – wildplasser

答えて

3
[{}] return *yytext; 
[^{}\n]+ return ANYTHING; 
\n  return EOL; 

Lexは欲張りです:2つのパターンが現在の入力と一致する場合、最長一致が勝ちます。元のlexフラグメントでは、[^\n]+パターンは{または}の行をキャッチします。

+0

はい、それはすべての他の字句(yuck!)と衝突しないように 'ANYTHING'を制限し、そこにすべてを組み立てるANYTHING_という非終端記号規則を追加する解決策です。...字句の状態を設定する可能性はありません適切な場所でトリガーするだけの単なる「何か」の語彙素を持つのに十分な信頼性がありますか? – mistotebe

+0

あなたは何を意味するのか分かりません。何も\ nと{}以外のものにマッチさせる必要がある場合は、ネゲートされた文字クラスが行く方法です(何が間違っていますか?)。 {}を(文字列やコメントなどで)保存したい場合は、開始条件が必要になるでしょう。 (または、それが十分簡単に​​見えるので、手作業でレクサーを作成する) – wildplasser

+0

これは[this](http://mistotebe.net/image/grammar.txt)の単なる断片であり、他の語彙とANYTHINGトークンを指定する方法がありますかなり退屈になるでしょう。これらの開始条件は何ですか? – mistotebe

関連する問題