PLY Yacc如何指定多行产生式?

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              
   '''
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"""

使用switch语句处理每种可能情况比使用大量的if块更易读。


1
"envvar" 是一种跨多行的单一产生式,因此我无法使用替代方案。我正在寻找 Yacc 支持的功能,即允许在每个产生式之间插入注释。例如,envvar: T_EV /* EV_ / T_ID / 2: 环境变量名称 / T_COLON / : / T_INT_VAL / 4: 类型:0 整数,1 浮点数,0 字符串,0 数据 */ - satish
好的,那么@ioannis-filippidis的答案可能更好。 - swstephe

0

有一种方法可以将长的docstring分成多行,以一种PLY可以理解的方式:

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

这个神奇的方法归功于this的原作者。 请注意括号:它们比使用\进行转义要好得多,因为它们符合PEP 8的规范,所以语法检查器不会抱怨。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接