0

以下は、私の作業中の EBNF 文法の単純化です。

%token NEWLINE BLOCK_MARK A
%start file

file: block+ NEWLINE*;
block: BLOCK_MARK line;
line: A+;

\n と EOF の両方がトークンとして NEWLINE を吐き出します (EOF の前に単一の末尾の NEWLINE が必要ないように)。次のようなストリームで動作します。

BLOCK_MARK A A BLOCK_MARK A NEWLINE[actually EOF]

少なくとも 1 つが必須で、残りは で区切られてlineいます。例えば:blockNEWLINE

BLOCK_MARK A A NEWLINE A A BLOCK_MARK A A A EOF

私はこれをやってみました:

file: block+ NEWLINE*;
block: BLOCK_MARK line moreline*;
line: A+;
moreline: NEWLINE line;

しかし、先読みが の場合、Jison は S/R 競合について不平を言いNEWLINEます。NEWLINEステート マシンは、が新しいブロックの一部なのlineか、最後のNEWLINE*ブロックなのかを判断するのに混乱していると思いfileます (ファイルが NEWLINE/EOF で終わる可能性があるため、これが必要です)。

どうすればこれを修正できますか?

4

2 に答える 2