2012-03-23 76 views
3

在簾布層我們如何能夠區分使用規則之間 -Python的PLY多個規則

例如: - ''」 號碼:A B | c | d ''' 所以假設我們需要針對不同的規則編寫不同的代碼。那麼有沒有什麼優雅的方式來做到這一點。手冊中給出的一種方法是使用規則和令牌的組合,但我發現並不總是點擊。

回答

-1

只需將表達式分解爲多個規則,每個不同的代碼都有一個規則。

例如(從http://www.dabeaz.com/ply/ply.html#ply_nn25

def p_expression(p): 
    '''expression : expression PLUS term 
       | expression MINUS term''' 
    if p[2] == '+': 
     p[0] = p[1] + p[3] 
    elif p[2] == '-': 
     p[0] = p[1] - p[3] 

也可以寫成

def p_expression_plus(p): 
    'expression : expression PLUS term' 
    p[0] = p[1] + p[3] 

def p_expression_minus(t): 
    'expression : expression MINUS term' 
    p[0] = p[1] - p[3] 
+1

發現是的,我們能做到這一點,但想象的代碼行數炸燬。我們也可以爲每一行使用不同的標記。我想知道是否有一些變量,如規則,告訴哪個規則被使用。不管怎樣,謝謝。 – 2012-03-23 21:28:20

+0

啊,我明白了,對不起!恐怕我不知道一個變量來告訴哪個規則被使用了。 (我想你會期待代碼被炸燬,因爲你對不同的規則有非常相似的代碼,也許你可以調用一個幫助函數來解析類似的規則,然後分解成不同函數的開銷不會太高?) – 2012-03-23 21:49:10

+0

This won在更復雜的語法情況下工作,其中具有不同優先級的規則需要'%pred'來避免減少 - 減少衝突,因爲這些規則需要處於同一級別。 – dionyziz 2014-06-03 20:14:07

-1

有多個解析器是沒有問題的,請檢查PLY documenation(這裏 http://www.dabeaz.com/ply/ply.html#ply_nn37

lexer = lex.lex()  # Return lexer object 
parser = yacc.yacc()  # Return parser object 

下一頁,在解析時,確保給parse()函數一個對應該使用的詞法分析器的引用。例如:

parser.parse(text,lexer=lexer) 

如果您忘記這麼做,解析器將使用最後一個詞法分析器創建 - 這並不總是您想要的。

的話,你可以包括一些屬性

在解析器中,「詞法分析器」和「解析器」屬性指的是詞法和語法分析器分別對象。

def p_expr_plus(p): 
    'expr : expr PLUS expr' 
    ... 
    print p.parser   # Show parser object 
    print p.lexer   # Show lexer object 

更多細節可以在這裏

http://www.dabeaz.com/ply/ply.html#ply_nn37

+0

他不是在問多個詞法分析器和多個分析器 - 問題是關於單個分析器中的多個語法規則。 – dionyziz 2014-06-03 20:12:59