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
~~~
通常,计算列的信息是为了指示上下文的错误位置,所以只在必要时有用。