处理 EBNF 中的空格

Handling whitespace in EBNF

假设我为更简单的两项加法器定义了以下 EBNF:

<expression>    ::= <number> <plus> <number>
<number>        ::= [0-9]+
<plus>          ::= "+"

已显示 here

什么是允许任何数量的白色 space 除了条款之间的 newline/return 之外的正确方法?例如允许:

1 + 2
1 <tab> + 2
1           + 2

等等

例如,执行以下操作失败:

<whitespace>::= " " | \t

此外,似乎(几乎)每个术语的前后​​都有一个可选的 space。类似于:

<plus>          ::= <whitespace>? "+" <whitespace>?

如何正确解决这个问题?

XML 标准,例如,whitespace 使用以下产生式:

S ::= (#x20 | #x9 | #xD | #xA)+

如果不需要,可以省略 CR (#xD) 和 LF (#xA)。

关于您观察到的语法可能会被空白非终结符淹没,请注意空白处理可以在词法分析而不是解析中完成。参见 EBNF Grammar for list of words separated by a space