2010-05-08 51 views
3

我正在使用Python和PLY來解析類似LISP的S-表達式,並且在解析函數調用時可以有零個或多個參數。我怎樣才能把這個放入yacc代碼中。這是我目前的功能:Python PLY零次或多次出現的解析項目

def p_EXPR(p): 
    '''EXPR : NUMBER 
      | STRING 
      | LPAREN funcname [EXPR] RPAREN''' 
    if len(p) == 2: 
     p[0] = p[1] 
    else: 
     p[0] = ("Call", p[2], p[3:-1]) 

我需要用允許零個或多個EXPR的東西替換「[EXPR]」。我怎樣才能做到這一點?

回答

2

如何:

EXPR : NUMBER 
     | STRING 
     | LPAREN funcname EXPR_REPEAT RPAREN 
EXPR_REPEAT: /*nothing*/ 
     | EXPR EXPR_REPEAT 
0

你確定你想要一個上下文無關文法,而不是一個解析表達式語法?另外,根據我的經驗,PLY的設計非常不利於語法和解析以及後期處理,所以我會推薦使用更多模塊化設計的實現。