处理 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。
假设我为更简单的两项加法器定义了以下 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。