这是我的工作 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]
现在我想有几个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 结尾)。
我怎样才能解决这个问题?