7

我已经为我计划在以后的项目中使用的预处理器语言编写了标记器和表达式评估器。我开始想也许我应该用 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 中编写我的语言描述,我应该在考虑运算符优先级的情况下编写它还是将其记录在单独的部分中?

4

1 回答 1

6

为我的大学学位做了类似的事情。

我建议不要使用运算符优先级功能,即使看起来更容易像“语法糖”。

为什么 ?因为大多数语言要由EBNF来描述,使用了很多具有不同特征的运算符,这些运算符更好地描述和更新,用EBNF表达式,而不是运算符优先级。

一些运算符是一元前缀,一些一元后缀,一些是二进制(也称为“中缀”),一些二进制是从左到右计算的,还有一些是从右到左计算的。一些符号在某些上下文中是运算符,并用作其他标记,在其他上下文中,例如“+”,“-”,可以是二元运算符(“x - y”),一元前缀运算符(“x - -y” ),或文字的一部分(“x + -5”)。

以我的经验,用 EBNF 表达式来描述它们更“安全”。除非您描述的编程语言非常小,语法运算符很少且相似(例如:全二进制,或全前缀一元)。

只是我的2美分。

于 2014-08-13T18:24:29.923 回答