在簾布層我們如何能夠區分使用規則之間 -Python的PLY多個規則
例如: - ''」 號碼:A B | c | d ''' 所以假設我們需要針對不同的規則編寫不同的代碼。那麼有沒有什麼優雅的方式來做到這一點。手冊中給出的一種方法是使用規則和令牌的組合,但我發現並不總是點擊。
在簾布層我們如何能夠區分使用規則之間 -Python的PLY多個規則
例如: - ''」 號碼:A B | c | d ''' 所以假設我們需要針對不同的規則編寫不同的代碼。那麼有沒有什麼優雅的方式來做到這一點。手冊中給出的一種方法是使用規則和令牌的組合,但我發現並不總是點擊。
只需將表達式分解爲多個規則,每個不同的代碼都有一個規則。
例如(從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]
有多個解析器是沒有問題的,請檢查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
更多細節可以在這裏
他不是在問多個詞法分析器和多個分析器 - 問題是關於單個分析器中的多個語法規則。 – dionyziz 2014-06-03 20:12:59
發現是的,我們能做到這一點,但想象的代碼行數炸燬。我們也可以爲每一行使用不同的標記。我想知道是否有一些變量,如規則,告訴哪個規則被使用。不管怎樣,謝謝。 – 2012-03-23 21:28:20
啊,我明白了,對不起!恐怕我不知道一個變量來告訴哪個規則被使用了。 (我想你會期待代碼被炸燬,因爲你對不同的規則有非常相似的代碼,也許你可以調用一個幫助函數來解析類似的規則,然後分解成不同函數的開銷不會太高?) – 2012-03-23 21:49:10
This won在更復雜的語法情況下工作,其中具有不同優先級的規則需要'%pred'來避免減少 - 減少衝突,因爲這些規則需要處於同一級別。 – dionyziz 2014-06-03 20:14:07