【发布时间】:2014-08-07 14:53:08
【问题描述】:
我已经为我计划在以后的项目中使用的预处理器语言编写了标记器和表达式评估器。我开始想也许我应该用 EBNF(扩展巴科斯-瑙尔形式)来描述这种语言,以使语法更易于维护,甚至可以用它来生成更高版本的解析器。
我的第一印象是 EBNF 用于标记化过程和语法验证。后来我发现它也可以用来描述运算符优先级,如in this post 或Wikipedia article:
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 中编写我的语言描述,我应该在编写时考虑运算符优先级还是在单独的部分中记录?
【问题讨论】:
-
没有。运算符优先级不是语义的,它是关于语法和分组的,它是在解析时实现的,而不是随后实现的。没有理由不在 EBNF 中表达它。
-
好问题。正是我现在正在努力解决的问题。
标签: programming-languages language-design operator-precedence ebnf expression-evaluation