好的,我认为这里有足够的CS专业来检查我的递归下降解析器的伪代码。我是从这个BNF开发的
EXP ::= EXP + TERM | EXP - TERM | TERM
TERM ::= TERM * FACTOR | TERM/FACTOR | FACTOR
FACTOR ::= (EXP) | DIGIT
DIGIT ::= 0|1|2|3
这里是伪代码:
procedure exp()
term()
if token == ‘+’
match(‘+’)
term()
elseif token == ‘-‘
match(‘-‘)
term()
else
break
procedure term()
factor()
if token == ‘*’
match(‘*’)
factor()
elseif token == ‘/’
match(‘/’)
factor()
else
break
procedure factor()
if token == ‘(‘
match(‘(‘)
exp()
match(‘)’)
else
digit()
procedure digit()
if token == ‘0’
match(‘0’)
elseif token == ‘1’
match(‘1’)
elseif token == ‘2’
match(‘2’)
else
match(‘3’)
match(t)
if token == t
advancetokenpointer
else
error
这是对的吗?我想我可能需要在每个程序中都有一个回报,而且我也不确定我的程序是否正确。也许包括结束程序?无论如何,非常感谢! : - )
答案 0 :(得分:1)
你到了一半。特别是,您没有考虑语法的左递归部分,例如" EXP :: = EXP ..."或" TERM :: = TERM ......&# 34。
无论如何,递归下降并不适合左递归,但幸运的是,你可以在语法中执行标准转换来消除这种左递归。例如,以下语法:
A ::= A x B | B
可以这样编码:
procedure A()
B()
repeat
if token == 'x'
match('x')
B()
else
break
此外,因子的代码没有正确遵循语法。请注意,在第一个替代方案中,EXP被称为递归调用(这是递归下降没有问题的一种递归),而您正在调用因子。此外,您正在匹配右括号,就好像它是可选的,而实际上是必需的。 DIGIT的代码中存在同样的问题。如果0,1或2都不匹配,则3必须匹配。