私は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')