【发布时间】:2019-07-08 10:51:48
【问题描述】:
查看 CPython 的 tokenizer.c 时,分词器会返回特定的错误消息。
例如,您可以查看标记器尝试parse a decimal number 的部分。当尝试解析数字 5_6 时,一切都应该没问题,但是当尝试解析数字 5__6 时,标记器应该返回带有“无效十进制文字”消息的 SyntaxError:
static int
tok_decimal_tail(struct tok_state *tok)
{
int c;
while (1) {
do {
c = tok_nextc(tok);
} while (isdigit(c));
if (c != '_') {
break;
}
c = tok_nextc(tok);
if (!isdigit(c)) {
tok_backup(tok, c);
syntaxerror(tok, "invalid decimal literal");
return 0;
}
}
return c;
}
使用 Python,我尝试访问标记器的 SyntaxError 消息:
In [12]: try:
...: eval('5__6')
...: except SyntaxError as e:
...: print(e.args, e.filename, e.lineno, e.msg, e.text)
('invalid token', ('<string>', 1, 2, '5__6')) <string> 1 invalid token 5__6
有没有办法从分词器中提取 SyntaxError 消息?
【问题讨论】:
-
它返回
0,而不是SyntaxError。消息被传递给syntaxerror。 -
@Goyo;是的,没错。不过,它确实在其他地方返回
syntaxerror。查看Line 1453 并尝试在您的解释器中编译“0xk”行。它返回syntaxerror并带有正确的错误消息,但您无法在解释器中提取它。 -
@Goyo:分词器在分词器状态上设置了一个异常,这会导致引发语法错误异常。
标签: python cpython python-internals