program-in-chinese / overview

中文编程的历史、现状和展望。issue 中进行相关问题的讨论.
https://zhuanlan.zhihu.com/codeInChinese
GNU General Public License v3.0
383 stars 34 forks source link

BNF 范式如何设计运算符的优先级? #164

Closed luoyou closed 5 years ago

luoyou commented 5 years ago

经典的四则运算的BNF范式如下:

expression: term   { ("+" | "-") term }
term:       factor { ("*" | "/") factor }
factor:     NUMBER | "(" expression ")" | - factor

不少书上都是这么写的,但是实际在设计语言的时候,运算符是非常多的,我略微完善了一下运算符的,写出的BNF范式如下:

expression      : term   { ("+" | "-" | "==" | ">" | ">=" | "<" | "<=" | "&&" | "||" | "!") term }
term            : factor { ("*" | "/" | "%") factor }
factor          : NUMBER | IDENTIFIER | BOOL | "(" expression ")" | - factor | ! factor

里面涉及到的符号实在太多(而且还没处理好符号的优先级),虽然可以很简单的按照优先级进行拆分,但是这样形成的BNF范式太长太丑了,不知道大家有没有比较好的设计方法?

谈及到优先级问题,大家有没有考虑过放弃运算符的优先级,直接按照从左到右的模式进行设计,需要优先级的地方自己加(),不知道这样如何。

nobodxbodon commented 5 years ago

之前我的作业也是类似,支持了'×'|'÷'所以会更长:

表达式: 求积表达式 (('+'|'-') 求积表达式)*;

求积表达式: 最小表达式 (('*'|'/'|'×'|'÷') 最小表达式)*;

最小表达式
  : 字面量
  | '(' 表达式 ')'
  ;

字面量
  : T数
  | T变量名
  ;

Python语法定义这里也是按优先级拆分。看起来还好吧。

关于优先级,个人觉得要考虑到大多数用户的情况,国内应该小学二年级就开始四则运算,而且着重强调了运算优先级(待确定,手边没有最新的教材)。如果是这样的话,如果语言设计和用户的习惯思维抵触太大,恐怕因此导致的无心的语义错误会太过频繁。

luoyou commented 5 years ago

@nobodxbodon 感谢,我来研究下