2016-08-11 4 views
0

У меня есть лексер, написанный с 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') 

ответ