1

我想为我的表达式评估器添加 +/- 符号支持,但是我不确定它是否应该是作为数字标记的一部分的词法元素(例如number = [\+\-]*[0-9]+)或句法元素(例如primary ::= [ ( "+" | "-" ) ] primary | numberwhere number = [0-9]+)。

从上面可以看出,这个标志可以任意多。目前,我已经使用递归下降和运算符优先级解析实现了语法版本。但我仍然不确定这是否是一个好的选择。我发现的一件事是,语法版本需要对遇到的每个符号进行递归。

4

2 回答 2

0

我认为如果您同时使用这两种方法会很好:1 - -1 = 2

于 2011-10-21T14:24:54.190 回答
0

实际上,很难使“-”成为词法元素,因为您还需要在其他用法中将其识别为标准的双操作数“减”运算符。

如果您生成“-”作为独立词位,则解析器可以根据您提供的语法规则轻松确定它是减法运算符还是否定运算符。

词法分析器无法做出此决定,因为根据设计它无法访问解析器状态。那么它如何合理地判断它刚刚遇到的“-”字符是否应该导致“-”标记的生成,或者被后面的数字文字消耗呢?如果它被以下数字文字消耗,那么您的解析器将无法处理该表达式:

 x - -2

作为处理这两种减号类型的语法规则,您可能想要的是:

expression = sum ;

sum =  term ;
sum = sum '+' term ;
sum = sum '-' term ;

term = primary ;
term = term '*' primary ;
term = term '/' primary

primary = '-' primary ;
primary = '(' expression ')' ;
primary = number ;
primary = identifier ;

(我会让你将这些重构为适合你的任何形式)。

于 2011-10-25T11:31:32.460 回答