几个词法分析器与PLY的一个解析器?
我正在尝试使用PLY for Kconfig语言来实现一个Python解析器,用于生成Linux内核的配置选项。几个词法分析器与PLY的一个解析器?
有一个关键词叫做源执行的包容,所以我要做的就是,当词法分析器遇到这个关键字,我改变词法分析器国家创造这是会LEX的源文件中的新词法分析器:
def t_begin_source(t):
r'source '
t.lexer.begin('source')
def t_source_path(t):
r'[^\n]+\n+'
t.lexer.begin('INITIAL')
global path
source_lexer = lex.lex(errorlog=lex.NullLogger())
source_file_name = (path + t.value.strip(' \"\n'))
sourced_file = file(path + t.value.strip(' \"\n')).read()
source_lexer.input(sourced_file)
while True:
tok = source_lexer.token()
if not tok:
break
别的地方我这行
lexer = lex.lex(errorlog=lex.NullLogger())
这是“主”或“根”词法这是会被解析器调用。
我的问题是,我不知道该怎么告诉解析器使用不同的词法分析器或告诉“source_lexer”返回的东西......
也许应该使用克隆功能...
感谢
我不知道帘布层的细节,但在其他系统这样我建立的,它是最有意义有其管理的包含文件堆的单个词法分析器。所以词法分析器会返回统一的令牌流,打开和关闭包含文件。
好吧,
所以我做了什么是建筑上的所有标记,这是实际的解析之前建的列表。
解析器不再调用词法分析器,因为您可以在调用解析函数时重写解析器使用tokenfunc参数使用的getToken函数。
result = yacc.parse(kconfig,debug=1,tokenfunc=my_function)
和我现在调用函数获取下一个标记的函数迭代先前构建的标记列表。
考虑到lexing,当我遇到源关键字时,我克隆我的词法分析器并更改输入以包含文件。
def sourcing_file(source_file_name):
print "SOURCE FILE NAME " , source_file_name
sourced_file = file(source_file_name).read()
source_lexer = lexer.clone()
source_lexer.input(sourced_file)
print 'END OF SOURCING FILE'
while True:
tok = source_lexer.token()
if not tok:
break
token_list.append(tok)
通过一个有趣的巧合来自同一个谷歌搜索,导致我对这个问题的链接解释如何write your own lexer for a PLY parser。这篇文章解释简单,但它是四个实例变量和单个方法的问题。
我也这样做过......但最后,构建完整的令牌列表并使用我自己的getToken函数的解决方案并不是那么糟糕...... – LB40 2009-12-04 14:51:55
您可以使用词法分析器的“输入”方法来重置词法分析器并提供新的输入。包含的文件完成后,您必须返回原始文件(或多或少)。 – 2009-11-11 21:26:20
是的,但我不知道如何将这些标记返回给解析器。 – LB40 2009-11-12 20:27:37