以下は、私の作業中の 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
います。例えば:block
NEWLINE
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 で終わる可能性があるため、これが必要です)。
どうすればこれを修正できますか?