我正在尝试使用PLY实现一个python解析器,用于生成Linux内核配置选项的Kconfig语言。
有一个名为source的关键字执行包含,所以我做的是当词法分析器遇到这个关键字时,我改变词法分析器状态以创建一个新的词法分析器,它将使源文件变为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())
这是解析器将调用的“main”或“root”词法分析器。
我的问题是我不知道如何告诉解析器使用不同的词法分析器或告诉“source_lexer”返回一些内容......
也许应该使用克隆功能......
由于
答案 0 :(得分:2)
我不知道PLY的细节,但在我构建的其他类似系统中,最有意义的是拥有一个管理堆栈包含文件的词法分析器。因此,词法分析器将返回统一的令牌流,打开和关闭包含遇到的文件。
答案 1 :(得分:2)
一个有趣的巧合,来自同一Google搜索的链接引导我解答如何write your own lexer for a PLY parser。这篇文章解释得很简单,但这只是四个实例变量和单token
方法的问题。
答案 2 :(得分:0)
确定,
所以我所做的就是构建一个所有令牌的列表,它是在实际解析之前构建的。
解析器不再调用词法分析器,因为在调用解析函数时可以使用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)