使用 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

中查看状态