4.6 行号和位置信息

最后更新于:2022-04-01 01:09:41

默认情况下,lex.py对行号一无所知。因为lex.py根本不知道何为”行”的概念(换行符本身也作为文本的一部分)。不过,可以通过写一个特殊的规则来记录行号: ~~~ # Define a rule so we can track line numbers def t_newline(t): r'\n+' t.lexer.lineno += len(t.value) ~~~ 在这个规则中,当前lexer对象t.lexer的lineno属性被修改了,而且空行被简单的丢弃了,因为没有任何的返回。 lex.py也不自动做列跟踪。但是,位置信息被记录在了每个标记对象的`lexpos`属性中,这样,就有可能来计算列信息了。例如:每当遇到新行的时候就重置列值: ~~~ # Compute column. # input is the input text string # token is a token instance def find_column(input,token): last_cr = input.rfind('\n',0,token.lexpos) if last_cr < 0: last_cr = 0 column = (token.lexpos - last_cr) + 1 return column ~~~ 通常,计算列的信息是为了指示上下文的错误位置,所以只在必要时有用。
';