来自BNF的递归下降解析器伪代码

时间:2015-03-03 03:24:06

标签: parsing recursion bnf

好的,我认为这里有足够的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

这是对的吗?我想我可能需要在每个程序中都有一个回报,而且我也不确定我的程序是否正确。也许包括结束程序?无论如何,非常感谢! : - )

1 个答案:

答案 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必须匹配。