python - PLY yacc 指定多线生产

标签 python yacc ply

有没有办法使用以下语法定义多行生产? 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              
   '''

最佳答案

您应该使用“竖线”来分隔备用规则:

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 block 来处理每种可能的情况更容易阅读。

关于python - PLY yacc 指定多线生产,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19850048/

相关文章:

Python:如何找到分隔两个不同集群的值?

python - pyclips 的 Clipspy 挂件 Clips.ErrorStream.Read()

python - 带有重定向的 Werkzeug(Flask)响应不起作用

bison - Yacc 的某些版本是否在规则和操作之间使用 '='?

linux - 针对 lex 和 yacc 中的小错误的建议

python - 模块未找到错误: No module named 'keras.api' error

c - 如何在 Lex 和 Yacc (Solaris) 中使 YY_INPUT 指向字符串而不是标准输入

python - 从字典 python 的键动态生成正则表达式

python - PLY:快速解析长长的项目列表?

python - 层 lex yacc : Errors handling