【问题标题】:several lexers for one parser with PLY?一个带有 PLY 的解析器的几个词法分析器?
【发布时间】:2009-11-11 21:07:15
【问题描述】:

我正在尝试使用 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”返回一些东西......

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

谢谢

【问题讨论】:

    标签: python lexer ply


    【解决方案1】:

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

    【讨论】:

    • 您可以使用词法分析器的input 方法来重置词法分析器并提供新的输入。包含的文件完成后,您必须返回到您离开的原始文件(或多或少)。
    • 是的,但我不知道如何将这些标记返回给解析器。
    【解决方案2】:

    一个有趣的巧合来自同一个 Google 搜索的链接,它让我知道了这个问题,它解释了如何write your own lexer for a PLY parser。这篇文章解释得简单又好,但它是四个实例变量和单个token 方法的问题。

    【讨论】:

    • 我也这样做了...但最后,构建完整的令牌列表并使用我自己的 getToken 函数的解决方案还不错...
    【解决方案3】:

    好的,

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

    解析器不再调用词法分析器,因为您可以在调用解析函数时使用 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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多