3

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

有一个名为 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()) 

这是解析器将调用的“主”或“根”词法分析器。

我的问题是我不知道如何告诉解析器使用不同的词法分析器或告诉“source_lexer”返回一些东西......

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

谢谢

4

3 回答 3

2

一个有趣的巧合是来自同一个 Google 搜索的链接,它让我看到了这个问题,它解释了如何为 PLY 解析器编写自己的词法分析器。帖子解释得简单又好,但它是四个实例变量和单个token方法的问题。

于 2009-12-04T00:03:50.197 回答
2

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

于 2009-11-11T21:18:11.080 回答
0

好的,

所以我所做的是构建所有令牌的列表,该列表是在实际解析之前构建的。

解析器不再调用词法分析器,因为您可以在调用解析函数时使用 tokenfunc 参数覆盖解析器使用的 getToken 函数。

result = yacc.parse(kconfig,debug=1,tokenfunc=my_function)

我的函数(现在是为获取下一个令牌而调用的函数)迭代先前构建的令牌列表。

考虑到词法分析,当我遇到源关键字时,我会克隆我的词法分析器并更改输入以包含文件。

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)
于 2009-11-13T14:25:47.010 回答