2010-07-05 355 views
7

这是从Grammar: difference between a top down and bottom up?语法:自上而下和自下而上之间的区别? (实施例)

我从这个问题能够理解的后续问题:

  • 语法本身不是自顶向下或自底向上,解析器是
  • 还有,可以通过一个被解析而不是其他
  • (感谢Jerry Coffin

因此,对于这个语法(所有POS语法sible数学公式):

E -> E T E 
    E -> (E) 
    E -> D 

    T -> + | - | * |/

    D -> 0 
    D -> L G 

    G -> G G  
    G -> 0 | L 

    L -> 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 

这可以通过自上而下和自下而上的解析器读取吗?

你可以说这是一个自顶向下的语法或一个自下而上的语法(或两者都不)?


我问,因为我有一门功课的问题,询问:

“写自上而下和自下而上的语法为包括所有的语言......”(不同的问题)

我不知道这是否正确,因为它似乎没有自上而下和自下而上的语法这样的事情。任何人都可以澄清?

+0

你能提供完整的问题吗?也许有些事情会变得更清晰。 – 2010-07-14 20:47:21

+0

也许这将有助于查阅教科书定义的“自上而下”语法?我认为自顶向下的解析器只有在执行像递归下降而不是类似于广度优先搜索的技术(例如排队边尝试)时才会失败。 – gatoatigrado 2010-07-21 02:32:37

回答

5

该语法很愚蠢,因为它将lexing和parsing合为一体。但好的,这是一个学术的例子。

自下而上和自上而下的事情是有特殊的角落案例,很难实现与你正常的前瞻。我可能认为你应该检查它是否有问题并改变语法。

如果您想了解语法我写了一个合适的EBNF

expr: 
    expr op expr | 
    '(' expr ')' | 
    number; 

op: 
    '+' | 
    '-' | 
    '*' | 
    '/'; 

number: 
    '0' | 
    digit digits; 

digits: 
    '0' | 
    digit | 
    digits digits; 

digit: 
    '1' | 
    '2' | 
    '3' | 
    '4' | 
    '5' | 
    '6' | 
    '7' | 
    '8' | 
    '9'; 

我特别不喜欢规则digits: digits digits。目前尚不清楚第一位数字在哪里开始,第二位数字在哪里结束。作为

digits: 
    '0' | 
    digit | 
    digits digit; 

的另一个问题是number: '0' | digit digits;这种冲突与digits: '0'digits: digit;我将执行规则。事实上,这是重复的。我会将规则更改为(删除数字):

number: 
    '0' | 
    digit | 
    digit zero_digits; 

zero_digits: 
    zero_digit | 
    zero_digits zero_digit; 

zero_digit: 
    '0' | 
    digit; 

这使得语法LR1(左递归,前视一下)和上下文自由。这就是你通常给像野牛这样的解析器生成器的东西。而且,由于北美野牛的发展速度很快,这对于自下而上的解析器来说是一个有效的输入。

对于自顶向下的方法,至少对于递归体裁,左递归是有点问题。如果你喜欢,你可以使用回滚,但是对于这些,你想要一个RR1(右递归一个向前看)语法。要做到这种交换递归:

zero_digits: 
    zero_digit | 
    zero_digit zero_digits; 

我不知道如果你回答你的问题。我认为这个问题是严重制定和误导的;和我写解析器为生...