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

2 投票
1 回答
2011 浏览
提问于 2025-04-18 18:08

这三者都可以用来跳过、忽略或者跳过某些字符。例如:

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

所有这些功能都可以在PLY文档中找到详细说明。

t.lexer.skip()主要是在出错时使用,它可以让输入向前移动固定数量的字符,而不去处理这些字符。

t_ignorepass的用法也很相似。t_ignore是一个特殊的规则,用来忽略那些在识别过程中不重要的字符。它主要是用来忽略空格和类似的字符。例如,它可以用来忽略注释,但手册提醒说这样做可能会影响其他识别功能,所以要小心。比如,可以通过以下方式忽略注释:

t_ignore_COMMENT = r'\#.*'

pass则是在识别到一个词法单元后,用来丢弃它而不生成一个标记。手册中也给出了一个类似的注释示例:

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

撰写回答