我正在尝试使用 PLY 为用于生成 linux 内核配置选项的 Kconfig 语言实现一个 python 解析器。

有一个名为 source 的关键字执行包含,所以我所做的是当词法分析器遇到这个关键字时,我更改词法分析器状态以创建一个新的词法分析器,它将对源文件进行词法分析:

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”返回一些东西......

也许应该使用克隆功能......

谢谢

最佳答案

我不知道 PLY 的细节,但在我构建的其他类似系统中,拥有一个管理包含文件堆栈的词法分析器是最有意义的。因此词法分析器将返回一个统一的标记流,在遇到它们时打开和关闭包含文件。

关于python - 一个带有 PLY 的解析器的几个词法分析器?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1718067/

10-12 18:59