层中的特例lexer规则

时间:2014-07-20 22:53:44

标签: python lexer ply

是否有办法处理特殊情况下的一个法律词法分析器规则?

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

2 个答案:

答案 0 :(得分:2)

是的,您获得OPERATOR令牌而非预期PRODUCES / DEFINE的原因是PLY词法分析器的令牌优先规则:

  

在内部,lex.py使用re模块进行模式匹配。什么时候   构建主正则表达式,添加规则   以下顺序:

     
      
  1. 函数定义的所有标记的添加顺序与它们相同   出现在词法分析器文件中。
  2.   
  3. 接下来添加由字符串定义的标记   按正常表达长度减少的顺序对它们进行排序(更长   表达式首先添加)。
  4.   

只需将某些规则转换为函数:

def t_DEFINE(t):
    r'='
    return t

def t_PRODUCES(t):
    r'=>'
    return t

答案 1 :(得分:0)

我删除了自动t_DEFINEt_PRODUCES规则,并使用保留字技术来处理特殊情况:

special_operators = {'=': 'DEFINE',
                     '=>': 'PRODUCES'}

def t_OPERATOR(t):
    r'[<>=/*+-]+'
    t.type = special_operators.get(t.value, t.type)
    return t