我已经为我计划在以后的项目中使用的预处理器语言编写了标记器和表达式评估器。我开始想也许我应该用 EBNF(扩展巴科斯-瑙尔形式)来描述这种语言,以保持语法更易于维护,甚至用它来生成更高版本的解析器。
我的第一印象是 EBNF 用于标记化过程和语法验证。后来我发现它也可以用来描述运算符优先级,就像在这篇文章或维基百科文章中一样:
expression ::= equality-expression
equality-expression ::= additive-expression ( ( '==' | '!=' ) additive-expression ) *
additive-expression ::= multiplicative-expression ( ( '+' | '-' ) multiplicative-expression ) *
multiplicative-expression ::= primary ( ( '*' | '/' ) primary ) *
primary ::= '(' expression ')' | NUMBER | VARIABLE | '-' primary
我可以看到这如何允许生成器生成内置运算符优先级的代码,但这真的应该如何表达优先级吗?运算符优先级不是更多关于语义,EBNF 更多关于语法吗?如果我决定在 EBNF 中编写我的语言描述,我应该在考虑运算符优先级的情况下编写它还是将其记录在单独的部分中?