是否有办法处理特殊情况下的一个法律词法分析器规则?
t_IDENT = r'[a-zA-Z_][0-9a-zA-Z_]*'
t_OPERATOR = r'[<>=/*+-]+'
t_DEFINE = r'='
t_PRODUCES = r'=>'
我想将运算符定义为所列字符的任意组合,除了 =
和=>
都有自己的特殊情况。例如:
a + b
# IDENT('a') OPERATOR('+') IDENT('b')
a ++=--> b
# IDENT('a') OPERATOR('++=-->') IDENT('b')
a == b
# IDENT('a') OPERATOR('==-->') IDENT('b')
a => b
# IDENT('a') PRODUCES('=>') IDENT('b')
a = b
# IDENT('a') DEFINE('=') IDENT('b')
a >= b
# IDENT('a') OPERATOR('>=') IDENT('b')
a <=> b
# IDENT('a') OPERATOR('<=>') IDENT('b')
答案 0 :(得分:2)
是的,您获得OPERATOR
令牌而非预期PRODUCES
/ DEFINE
的原因是PLY词法分析器的令牌优先规则:
在内部,lex.py使用
re
模块进行模式匹配。什么时候 构建主正则表达式,添加规则 以下顺序:
- 函数定义的所有标记的添加顺序与它们相同 出现在词法分析器文件中。
- 接下来添加由字符串定义的标记 按正常表达长度减少的顺序对它们进行排序(更长 表达式首先添加)。
醇>
只需将某些规则转换为函数:
def t_DEFINE(t):
r'='
return t
def t_PRODUCES(t):
r'=>'
return t
答案 1 :(得分:0)
我删除了自动t_DEFINE
和t_PRODUCES
规则,并使用保留字技术来处理特殊情况:
special_operators = {'=': 'DEFINE',
'=>': 'PRODUCES'}
def t_OPERATOR(t):
r'[<>=/*+-]+'
t.type = special_operators.get(t.value, t.type)
return t