2011-06-07 109 views
2

我正在尝试为某些算术表达式创建适当的语法。我的表达式的有效标记如下:算术表达式语法

'+', '-', '/', '*''**'幂。表达式还可以包含符号和函数。这些函数可以有多个参数,其中一些可能是可选的。从我从表达式解析中记得的很少,我必须想出一个不是左递归的语法,并且还保留了操作符关联性。

因此,这里是我想出了,搜索(虽然不知道关联)的一点点后:

E = T Eopt 
Eopt = '+' T Eopt | '-' T Eopt | ε 
T = F Topt 
Topt = '*' F Topt | '/' F Topt | ε 
F = Number | '(' E ')' 

可以在很多教科书中找到。上述语法需要做什么修改,以便它可以修改权力标记('**')以及符号和函数?

请不要指向我flex/yacc等谢谢。

回答

1

你快到了。变化开始于F:

E = T Eopt 
Eopt = '+' T Eopt | '-' T Eopt | ε 
T = F Topt 
Topt = '*' F Topt | '/' F Topt | ε 
F = P Fopt 
Fopt = '**' P Fopt | ε 
P = Number | '(' E ')' 

这里假设你的标记生成器被***区分。

+0

P应该适应符号和函数吗? – John 2011-06-07 16:21:51

+1

@John:是的。添加... | ID | ID'('')'| ID'('args')'给P;添加新规则ARGS =表达式| ARGS','表达; – 2011-06-07 17:14:07