2010-07-05 54 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; 

我不知道如果你回答你的問題。我認爲這個問題是嚴重製定和誤導的;和我寫解析器爲生...