3

我正在使用 python 模块ply.lex编写词法分析器。我得到了一些用正则表达式指定的标记,但现在我卡住了。我有一个list of Keywords应该是的人tokendata是一个包含大约 1000 个关键字的列表,这些关键字应该都被识别为一种关键字。这可以是例如:_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)

所以我试图将变量添加到该正则表达式中,但它没有用。我总是得到: No regular expression defined for rule 't_KEYWORD'

先感谢您!约翰

4

3 回答 3

3

正如@DSM 建议的那样,您可以使用TOKEN 装饰器cat用于查找类似or dogis 的标记的正则表达式'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使用正则表达式的文档字符串。请注意,您定义令牌的顺序定义了它们的优先级,这通常很重要。

.

顶部的文档字符串不能是表达式,因此您需要逐个令牌定义进行此令牌定义。

我们可以在解释器中测试:

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 是__doc__函数的属性,因此如果您编写一个接受字符串表达式并将其设置为__doc__函数属性的装饰器 ply 可能会使用它。

于 2012-08-31T15:16:43.310 回答