几个词法分析器与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”返回的东西......

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

感谢

我不知道帘布层的细节,但在其他系统这样我建立的,它是最有意义有其管理的包含文件堆的单个词法分析器。所以词法分析器会返回统一的令牌流,打开和关闭包含文件。

+0

您可以使用词法分析器的“输入”方法来重置词法分析器并提供新的输入。包含的文件完成后,您必须返回原始文件(或多或少)。 – 2009-11-11 21:26:20

+0

是的,但我不知道如何将这些标记返回给解析器。 – LB40 2009-11-12 20:27:37

好吧,

所以我做了什么是建筑上的所有标记,这是实际的解析之前建的列表。

解析器不再调用词法分析器,因为您可以在调用解析函数时重写解析器使用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。这篇文章解释简单,但它是四个实例变量和单个方法的问题。

+0

我也这样做过......但最后,构建完整的令牌列表并使用我自己的getToken函数的解决方案并不是那么糟糕...... – LB40 2009-12-04 14:51:55