ply.lex中的t_ignore,pass和t.lexer.skip()有什么区别?

时间:2014-08-21 23:05:33

标签: python lex lexer ply

这三个都可用于跳过,忽略或传递字符。例如:

def t_error(t):
  pass

def t_error(t):
  t.lexer.skip()

def t_default(t): # put at the extreme end and assuming there are no string definitions
  r'.'
  pass or skip()

因此,在这种情况下,这三者似乎都有同样的目的。我承认某些方法比其他方法更优雅。

passt_ignoret.lexer.skip()之间的真正差异是什么?

1 个答案:

答案 0 :(得分:0)

所有这些功能都在PLY documentation

中描述

t.lexer.skip()主要用于错误情况,以在不处理字符的情况下使输入前进固定数量的字符。

t_ignorepass都可以以类似的方式使用。 t_ignore是一项特殊规则,用于忽略在识别中不起作用的字符。它主要用于忽略空格和类似类型的字符。例如,它可用于忽略注释,但是如果它导致其他识别功能出现问题,则手册会发出警告。例如,注释可以通过以下方式忽略:

t_ignore_COMMENT = r'\#.*'

pass用于在一旦识别后丢弃lexeme而不生成令牌。该手册给出了一个类似的评论示例:

def t_COMMENT(t):
    r'\#.*'
    pass
    # No return value. Token discarded