使用 PLY 解析时,如何为不平衡的大括号引发错误?
How to raise error for unbalanced braces, when parsing using PLY?
我有一个词法分析器,用ply写的。
词法分析器有两种状态:字符串和宏。宏是放在花括号中的特殊表达式。词法分析器非常简单:
states = (
('macro', 'exclusive'),
)
t_STRING = [^{] # any char but curly brace
def t_lcurlybrace(t):
r'{'
t.lexer.begin('macro')
... some other tokens for macro state
def t_macro_rcurlybrace(t):
r'}'
t.lexer.begin('INITIAL')
所以基本上它是这样工作的:
Two plus two is {2 + 2}
Lexer 为该行生成诸如 STRING、NUMBER、OPERATOR、NUMBER 之类的标记。
但我对错误处理感到困惑。如果输入是
Two plus two is {2 + 2
lexer 生成与以前相同的标记流。唯一不同的是词法分析器最后的状态(宏,不是 INITIAL)。
我想在这种情况下引发错误,但我无法在 lex 中找到任何用于此类任务的内置挂钩。现在我的猜测是将一个词法分析器包装在一个包装器中,当所有输入都被消耗时,它将检查词法分析器的状态。
更新:
我试过这样使用 t_eof:
def t_eof(t):
如果 t.lexer.current_state() != 'INITIAL':
引发异常('Unbalanced brackets')
但是没用。
更新2:
t_eof 必须定义为 t_macro_eof,因为在 "macro" 状态期间达到 EOF,
所以可以这样做:
def t_macro_eof(t):
raise Exception('Unbalanced brackets')
您可以在EOF handler
中查看状态
我有一个词法分析器,用ply写的。 词法分析器有两种状态:字符串和宏。宏是放在花括号中的特殊表达式。词法分析器非常简单:
states = (
('macro', 'exclusive'),
)
t_STRING = [^{] # any char but curly brace
def t_lcurlybrace(t):
r'{'
t.lexer.begin('macro')
... some other tokens for macro state
def t_macro_rcurlybrace(t):
r'}'
t.lexer.begin('INITIAL')
所以基本上它是这样工作的:
Two plus two is {2 + 2}
Lexer 为该行生成诸如 STRING、NUMBER、OPERATOR、NUMBER 之类的标记。
但我对错误处理感到困惑。如果输入是
Two plus two is {2 + 2
lexer 生成与以前相同的标记流。唯一不同的是词法分析器最后的状态(宏,不是 INITIAL)。
我想在这种情况下引发错误,但我无法在 lex 中找到任何用于此类任务的内置挂钩。现在我的猜测是将一个词法分析器包装在一个包装器中,当所有输入都被消耗时,它将检查词法分析器的状态。
更新:
我试过这样使用 t_eof: def t_eof(t): 如果 t.lexer.current_state() != 'INITIAL': 引发异常('Unbalanced brackets')
但是没用。
更新2:
t_eof 必须定义为 t_macro_eof,因为在 "macro" 状态期间达到 EOF, 所以可以这样做:
def t_macro_eof(t):
raise Exception('Unbalanced brackets')
您可以在EOF handler
中查看状态