2016-08-11 4 views
0

私はplyと書かれたレクサーを持っています。 Lexerには、文字列とマクロという2つの状態があります。マクロは中括弧で囲まれた特別な表現です。レクサーは非常に簡単です: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} 

レクサーは、この行の文字列、数値、OPERATOR、NUMBERのようなトークンを生成します。

しかし、エラー処理が残っています。入力が

Two plus two is {2 + 2 

の場合、レクサーは以前と同じトークンストリームを生成します。唯一の違いは、最後のレクサーの状態です(マクロではなく、INITIAL)。

このような場合にエラーを発生させたいのですが、そのようなタスクのためにlexにフックを組み込むことができません。今私の推測では、すべての入力が消費されたときにレクサーの状態をチェックするラッパーにレクサーをラップすることです。

UPDATE: デフt_eof(T):私はこのようなt_eof使用しようとした

場合t.lexer.current_state()= 'INITIAL':! 昇給の例外( 'アンバランス括弧' )

でも動作しませんでした。

アップデート2:

t_eofがt_macro_eofとして定義しなければならないEOFが "マクロ" 状態、 の間に達すると、それは次のように行うことができます。

def t_macro_eof(t): 
    raise Exception('Unbalanced brackets') 

答えて

0

あなたが状態を確認することができますthe EOF handler

関連する問題