ジソンパーサージェネレーターで解析したい単純なファイル形式があります。このファイルは、任意の順序と数量の複数の式で構成できます。パーサーの jison ファイルは次のとおりです。
/* lexical grammar */
%lex
%%
\s+ /* skip whitespace */
\"(\\.|[^"])*\" return 'STRING'
File\s*Version\s*\: return 'FILEVERSION'
[0-9]+("."[0-9]+)?\b return 'NUMBER'
<<EOF>> return 'EOF'
. return 'INVALID'
/lex
%start expressions
%% /* language grammar */
expressions
: EOF
| e expressions EOF
;
e
: STRING
| FILEID
;
FILEID
: FILEVERSION NUMBER { return $1 + $2; }
;
簡単にするために、ファイルを短縮して、文字列とファイル ID 式のみを含めました。
私の問題は、2 番目の式が文字列のような 1 つのトークンのみで構成されている場合、生成されたパーサーが 1 つまたは 2 つの完全な式のみを認識しているように見えることです。例えば:
ファイルのバージョン: 1.0
解析されるか、または
ファイルバージョン:1.0「マイストリング」
も解析されますが、
ファイルのバージョン: 1.0 「My String」「解析されていない文字列」
最後の文字列は解析されません。
このコードをjison デバッガーとjison ページ自体で試しましたが、両方のページで同じ結果が表示されます。
この問題に関する私の提案は次のとおりです。
- いくつかのレクサー エラー (正規表現)
- いくつかの文法エラー (左から右への再帰)
- パーサーにいくつかのアクションがありません (一種の { $$ = $1;} )
- 私が見逃している他のバイソン/ジソンの魔法
私は ebnf-parser-guru ではないので、回答はできるだけシンプルにしてください。