0

ジソンパーサージェネレーターで解析したい単純なファイル形式があります。このファイルは、任意の順序と数量の複数の式で構成できます。パーサーの 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. いくつかのレクサー エラー (正規表現)
  2. いくつかの文法エラー (左から右への再帰)
  3. パーサーにいくつかのアクションがありません (一種の { $$ = $1;} )
  4. 私が見逃している他のバイソン/ジソンの魔法

私は ebnf-parser-guru ではないので、回答はできるだけシンプルにしてください。

4

1 に答える 1