3

ply.lex字句解析プログラムを作成するためにPythonモジュールを使用しています。いくつかのトークンを正規表現で指定しましたが、スタックしました。私はlist of Keywords誰である必要がありtokenます。dataは約1000個のキーワードのリストであり、すべて1種類のキーワードとして認識されます。これは、たとえば、次_Function1 _UDFType2のようになります。リスト内のすべての単語は、空白で区切られています。そのレクサーにこのリスト内の単語を認識させて、タイプ`KEYWORDのトークンを返すようにします。

data = 'Keyword1 Keyword2 Keyword3 Keyword4'
def t_KEYWORD(t):
    # ... r'\$' + data ??
    return t

text = '''
Some test data


even more

$var = 2231




$[]Test this 2.31 + / &
'''

autoit = lex.lex()
autoit.input(text)
while True:
    tok = autoit.token()
    if not tok: break
    print(tok)

そのため、その正規表現に変数を追加しようとしましたが、機能しませんでした。私はいつもgettinです: No regular expression defined for rule 't_KEYWORD'

前もって感謝します!ジョン

4

3 に答える 3

3

@DSMが示唆しているように、 TOKENデコレータを使用できます。catまたはdogのようなトークンを検索するための正規表現'cat|dog'(つまり'|'、スペースではなく単語で区切られている)。だから試してみてください:

from ply.lex import TOKEN
data = data.split() #make data a list of keywords

@TOKEN('|'.join(data))
def t_KEYWORD(t):
    return t
于 2012-08-31T17:03:20.390 に答える
2

ply.lex正規表現にdocstringを使用します。トークンを定義する順序がそれらの優先順位を定義することに注意してください。これは通常、管理することが重要です。

上部のdocstringを式にすることはできないため、このトークン定義はトークン定義ごとに行う必要があります。

これはインタプリタでテストできます。

def f():
    "this is " + "my help"  #not a docstring :(
f.func_doc #is None
f.func_doc = "this is " + "my help" #now it is!

したがって、これは機能するはずです。

def t_KEYWORD(token):
    return token
t_KEYWORD.func_doc=r'REGULAR EXPRESSION HERE' #can be an expression
于 2012-08-31T14:53:11.030 に答える
0

これがplyで機能するかどうかはわかりませんが、docstringは関数の属性であるため、文字列式を受け取り、それを関数ply__doc__の属性に設定するデコレータを作成する場合は、それを使用する可能性があります。__doc__

于 2012-08-31T15:16:43.310 に答える