У меня есть лексер, написанный с ply. Lexer имеет два состояния: строку и макросы. Макросы - это особое выражение, помещенное в фигурные скобки. Лексер очень просто:Как повысить погрешность для несбалансированных брекетов при анализе с использованием 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 производит маркеры, как строка, число оператора, номер для этой строки.
Но я застрял в обработке ошибок. Если входной сигнал
Two plus two is {2 + 2
lexer производит тот же поток токенов, что и раньше. Единственное отличие - это состояние лексера в конце (макрос, а не INITIAL).
Я хочу поднять ошибку в таком случае, но я не могу найти какие-либо встроенные в lex для этой задачи. Теперь я предполагаю, что вы переносите lexer в оболочку, которая проверяет состояние лексера, когда потребляется весь вход.
UPDATE:
Я пытался использовать t_eof так: Защиту t_eof (т): если t.lexer.current_state() = 'ИСХОДНЫЙ': рейз Exception ('несбалансированные скобки')
но это не сработало.
UPDATE2:
t_eof должен быть определен как t_macro_eof, по достижении EOF во время «макро» состоянии, так это может быть сделано, как:
def t_macro_eof(t):
raise Exception('Unbalanced brackets')