PLYを使って1つのパーサーに対して複数のレクサー?

lexer ply python

私はLinuxカーネル用の設定オプションを生成するために使用されるKconfig言語用のPLYを使用してpythonパーサーを実装しようとしています。

包含を実行するsourceというキーワードがあるので、私がしていることは、lexerがこのキーワードに遭遇したときに、lexer状態を変更してソースファイルをlexする新しいlexerを作成することです。

def t_begin_source(t):rのソース 't.lexer.begin(' source ')

def t_source_path(t):r '[^ \ n] \ n' t.lexer.begin( 'INITIAL')グローバルパスsource_lexer = lex.lex(エラーログ= lex.NullLogger())source_file_name =(パスt.value) strip( '\ "\ n'))sourced_file = file(パスt.value.strip( '\" \ n'))。read()

source_lexer.input(sourced_file)

Trueの場合:tok:source_lexer.token()でなければtok:break

他のどこかにこの行があります

lexer = lex.lex(errorlog = lex.NullLogger())

これは、パーサによって呼び出されることになる「メイン」または「ルート」レクサーです。

私の問題は、パーサーに別のレクサーを使うように指示する方法や、「source_lexer」に何かを返すように指示する方法がわからないことです。

たぶんクローン機能を使用する必要があります…​

ありがとう

  2  2


ベストアンサー

私はPLYの詳細については知りませんが、私が構築したこのような他のシステムでは、インクルードファイルのスタックを管理する単一のレクサーを持つことが最も理にかなっていました。 そのため、レクサーはトークンの統一されたストリームを返し、インクルードファイルが見つかったときにそれらを開いたり閉じたりします。

2


興味深い偶然の一致によって、この質問に私を導いた同じグーグル検索からのリンクはどうするべきかを説明しますPLYパーサのためにあなた自身のレクサーを書いてください。 この記事では簡単に説明していますが、4つのインスタンス変数と1つの `token`メソッドの問題です。

2


OK、

だから私がやったのは実際の解析の前に構築されるすべてのトークンのリストを構築することです。

構文解析関数を呼び出すときにtokenfuncパラメーターを使用して、構文解析プログラムによって使用されるgetToken関数をオーバーライドできるため、構文解析プログラムはレクサーを呼び出しません。

結果= yacc.parse(kconfig、デバッグ= 1、tokenfunc = my_function)

次のトークンを取得するために呼び出される関数である私の関数は、以前に構築されたトークンのリストを反復処理します。

字句解析を考慮して、sourceキーワードに遭遇したとき、私は字句解析プログラムを複製し、入力をファイルを含むように変更します。

def sourcing_file(source_file_name):print "ソースファイル名"、source_file_name sourced_file = file(source_file_name).read()source_lexer = lexer.clone()source_lexer.input(sourced_file)print 'ソースファイルの終わり'

Trueの場合:tok = source_lexer.token()でなければtok:break token_list.append(tok)

0


タイトルとURLをコピーしました