Programming languages 使用EBNF描述运算符优先级

Programming languages 使用EBNF描述运算符优先级,programming-languages,language-design,operator-precedence,ebnf,expression-evaluation,Programming Languages,Language Design,Operator Precedence,Ebnf,Expression Evaluation,我已经为我计划在以后的项目中使用的预处理器语言编写了标记器和表达式计算器。我开始想,也许我应该用EBNF(extendedbackus–Naur Form)来描述语言,以使语法更易于维护,甚至可以用它来生成更高版本的解析器 我的第一印象是EBNF用于标记化过程和语法验证。后来我发现,它也可以用来描述运算符优先级,如或: 我可以看出生成器是如何生成具有内置运算符优先级的代码的,但这真的是应该如何表示优先级的吗?运算符优先级不是更关注语义,而EBNF更关注语法吗?如果我决定用EBNF来描述我的语言,

我已经为我计划在以后的项目中使用的预处理器语言编写了标记器和表达式计算器。我开始想,也许我应该用EBNF(extendedbackus–Naur Form)来描述语言,以使语法更易于维护,甚至可以用它来生成更高版本的解析器

我的第一印象是EBNF用于标记化过程和语法验证。后来我发现,它也可以用来描述运算符优先级,如或:


我可以看出生成器是如何生成具有内置运算符优先级的代码的,但这真的是应该如何表示优先级的吗?运算符优先级不是更关注语义,而EBNF更关注语法吗?如果我决定用EBNF来描述我的语言,我应该考虑操作符的优先级,还是将其记录在单独的章节中?

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

我建议不要使用运算符优先级功能,即使看起来像“syntact sugar”这样更简单

为什么??因为大多数语言都是由EBNF描述的,所以使用了许多具有不同特性的运算符,这些运算符最好使用EBNF表达式来描述和更新,而不是使用运算符优先级

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

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


只有我的2美分。

不。运算符优先级不是语义的,它是关于语法和分组的,它是在解析时实现的,而不是随后实现的。没有理由不在EBNF中表达。好问题。这正是我目前正在努力解决的问题。我建议在词汇分析过程中对字面符号进行分类。这样我们只需要在句法分析中考虑一元和二元运算符。当不使用后缀一元运算符时,生活也变得容易多了。Rust是没有后缀一元的强大语言的一个很好的例子。如果它更容易解析,那么对于人眼来说,它很可能更容易阅读。
expression ::= equality-expression
equality-expression ::= additive-expression ( ( '==' | '!=' ) additive-expression ) *
additive-expression ::= multiplicative-expression ( ( '+' | '-' ) multiplicative-expression ) *
multiplicative-expression ::= primary ( ( '*' | '/' ) primary ) *
primary ::= '(' expression ')' | NUMBER | VARIABLE | '-' primary