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つの'}'
ではなくトークンとして表示します。
私は間違っていますか?
あなたは '[^ {} \ n] +何かを返そうとしましたか? ' – wildplasser
それはうまくいきますが、テキストを「行」に分割するという元の考えは、フィールドに非EOL文字を許可することでした。 – mistotebe
それはあなたの '{}'をすべて食べるでしょうか? Lexは欲張りです:もし2つのパターンが現在の入力にマッチすれば、最も長いマッチが勝ちます。 – wildplasser