【问题标题】:special-case lexer rule in plyply 中的特殊情况词法分析器规则
【发布时间】:2014-07-20 22:53:43
【问题描述】:

有没有办法对 ply lexer 规则进行特殊处理?

t_IDENT     = r'[a-zA-Z_][0-9a-zA-Z_]*'
t_OPERATOR  = r'[<>=/*+-]+'
t_DEFINE    = r'='
t_PRODUCES  = r'=>'

我想将运算符定义为所列字符的任意组合,除了==&gt; 有自己的特殊情况。例如:

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

【问题讨论】:

标签: python lexer ply


【解决方案1】:

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

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

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

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

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-13
      • 2013-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多