ply.lex中t_ignore、pass和t.lexer.skip()的区别是什么?
这三者都可以用来跳过、忽略或者跳过某些字符。例如:
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()
所以在这个例子中,这三者似乎都能达到相同的效果。我承认,有些方法比其他方法更优雅。
那么,pass
、t_ignore
和t.lexer.skip()
之间到底有什么真正的区别呢?
1 个回答
0
所有这些功能都可以在PLY文档中找到详细说明。
t.lexer.skip()
主要是在出错时使用,它可以让输入向前移动固定数量的字符,而不去处理这些字符。
t_ignore
和pass
的用法也很相似。t_ignore
是一个特殊的规则,用来忽略那些在识别过程中不重要的字符。它主要是用来忽略空格和类似的字符。例如,它可以用来忽略注释,但手册提醒说这样做可能会影响其他识别功能,所以要小心。比如,可以通过以下方式忽略注释:
t_ignore_COMMENT = r'\#.*'
pass
则是在识别到一个词法单元后,用来丢弃它而不生成一个标记。手册中也给出了一个类似的注释示例:
def t_COMMENT(t):
r'\#.*'
pass
# No return value. Token discarded