2011-10-21 22 views
1

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

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

+1

为什么你会允许任意多的?类似于'primary :: = [(“+”|“ - ”)] number |数字'看起来会更好。 –

+0

是的,我认为它也有点无用。一种语言应该有足够的表现力来缓解写作,但不能过度表达几乎任何东西都是可以接受的。无论如何,许多编程语言允许这样做,所以我想也许我应该实现它。我会采取这种简单的可选单点标记方法。 – LeleDumbo

回答

0

我认为,如果你同时使用它的好:1 - -1 = 2

+0

我不明白。两者是什么? – LeleDumbo

+0

我认为duedl0r表示二进制减号(在你的语法中没有显示)和一元减号(你已经显示)。我不认为这是你的问题的答案,但它暗示了答案。 –

+0

哦,我已经有了。两者都工作正常,我只是怀疑该方法的效率 – LeleDumbo

0

作为一个实际问题,这是很难做“ - ”是一个词汇元素,因为你还需要认识到它在其它使用为标准双操作数“减”运算符。

如果在制作“ - ”作为一个独立的语义,语法分析器可以很容易地决定它是否是减法运算符或因为您提供的grammmar规则否定操作。

词法分析器不能做出这个决定,因为在设计它没有进入解析器的状态。那么如何才能合理地判断它刚刚遇到的“ - ”字符是否应该导致产生' - '标记,或者是否被随后的数字字面量消耗?如果是通过以下数字文字,那么你的解析器消耗将与表达麻烦:

x - -2 

你probabaly想要什么文法规则来处理这两种类型的减号是:

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 ; 

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

+0

我已经有完整的语法,我只怀疑我上面发布的主要表达。无论如何,我的语法是左递归的:) – LeleDumbo