python - 如何设置yacc of ply的优先级

标签 python regex abstract-syntax-tree yacc ply

<分区>

我需要使用 ply 从正则表达式制作 AST。 例如,如果 RE 是 (a|b*)abc,我想将一个简化的元组作为 (':', (':', (':', ('|', 'a', ('* ', 'b')), 'a'), 'b'), 'c') <-- ':' 表示将字符串分成两部分。

这是我的代码。

tokens = (
    "SYMBOL",
    "LBRACKET",
    "RBRACKET",
    "STAR",
    "UNION"
)

t_ignore = ' \t\n'
t_SYMBOL = r'[a-zA-Z0-9]'
t_LBRACKET = r'\('
t_RBRACKET = r'\)'
t_STAR = r'\*'
t_UNION = r'\|'

def t_error(t):
    raise TypeError("Unknown text '%s'" % t.value)

def p_multiple(p) :
    '''string : SYMBOL SYMBOL
              | string SYMBOL
              | string string'''
    p[0] = (':', p[1], p[2])    

def p_union(p) :
    '''string : string UNION string'''
    p[0] = ('|', p[1], p[3])

def p_star(p) :
    '''string : string STAR'''
    p[0] = ('*', p[1])

def p_brackets(p) :
    '''string : LBRACKET string RBRACKET'''
    p[0] = p[2]


def p_symbol(p) :
    '''string : SYMBOL'''
    p[0] = p[1]

def p_error(p):
    print ("Syntax error at '%s'" % p.value)

lex.lex()
yacc.yacc()

lex.input("(a|b*)abc")
parsed = yacc.parse(RE)

最佳答案

为了复活这个问题,ply 允许您设置一个包含符号优先级的优先级变量。例如:

precedence = (
    ('left', 'PLUS', 'MINUS'),
    ('left', 'TIMES', 'DIVIDE'),
)

您可以在此处找到完整的教程和文档: http://www.dabeaz.com/ply/ply.html#ply_nn27 (我不得不使用查找功能来找到正确的位置)

关于python - 如何设置yacc of ply的优先级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40847318/

相关文章:

python pandas dataframe 仅为阈值中的数据创建 bin

python - 如何使用 RNFT 和 RNTO 命令重命名目录? (Python FTP)

sql - 获取Sql Server中以某个字母开头的按字母顺序排列的记录

c# - 匹配 wwR ("acddca” ) 在 C# 中使用正则表达式示例

compiler-construction - 编译器AST如何实现语句和表达式

python - 显示 html 标签的 django 模板

Python 并行执行 - threading.Lock 未按预期工作

regex - 正则表达式用于替换未用方括号括起来的子字符串出现的情况

c++ - 如何在 yacc union 中保存出现在同一规则中的两个相同类型的对象?

java - 以编程方式在工作区中查找接口(interface)的引用