3

有没有办法用以下语法定义多行生产?PLY 预计:在 ID 表示每条生产线一个生产之前。

def p_envvar(p):
   ''' 
   envvar : EV                    \
            ID                    \
            COLON                 \ 
            INT_VAL               \ 
            BOX_OPEN              \ 
            INT_VAL               \ 
            SEP                   \ 
            INT_VAL               \ 
            BOX_CLOSE             \ 
            STRING_VAL            \ 
            INT_VAL               \ 
            INT_VAL               \ 
            DUMMY_NODE_VECTOR     \ 
            comma_identifier_list \ 
            SEMICOLON              
   '''
4

2 回答 2

2

您应该使用“管道”来分隔备用规则:

def p_envvar(p):
    ''' 
    envvar : EV
           | ID
           | COLON
           | INT_VAL
           | BOX_OPEN
           | INT_VAL
           | SEP
           | INT_VAL
           | BOX_CLOSE
           | STRING_VAL
           | INT_VAL
           | DUMMY_NODE_VECTOR
           | comma_identifier_list
           | SEMICOLON  
    '''

但是对我使用这么多的替代提示,您可能需要简化,(您可以声明不同的函数来简化为相同的状态:

def p_envar_ev():
    """envvar : EV"""

def p_envvar_id():
    """envvar : ID"""

...等等。这比使用大的 if 块来处理每种可能的情况更容易阅读。

于 2013-11-20T21:39:07.053 回答
0

有一种方法可以以一种可以理解docstring的方式将 long 分布在多行中:PLY

def p_expr(p):
    ("""process_type : this is a very long """
     """ production rule """
     """ that does not fit on a single line """)

这个魔法的功劳归功于 this 的OP。注意括号:它们比用 转义要好得多\,因为它们符合PEP 8,所以语法检查器不会抱怨。

于 2014-04-11T08:09:02.703 回答