2009-11-11 58 views
2

我正在嘗試使用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」返回的東西......

也許應該使用克隆功能...

感謝

回答

2

我不知道簾布層的細節,但在其他系統這樣我建立的,它是最有意義有其管理的包含文件堆的單個詞法分析器。所以詞法分析器會返回統一的令牌流,打開和關閉包含文件。

+0

您可以使用詞法分析器的「輸入」方法來重置詞法分析器並提供新的輸入。包含的文件完成後,您必須返回原始文件(或多或少)。 – 2009-11-11 21:26:20

+0

是的,但我不知道如何將這些標記返回給解析器。 – LB40 2009-11-12 20:27:37

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) 
2

通過一個有趣的巧合來自同一個谷歌搜索,導致我對這個問題的鏈接解釋如何write your own lexer for a PLY parser。這篇文章解釋簡單,但它是四個實例變量和單個方法的問題。

+0

我也這樣做過......但最後,構建完整的令牌列表並使用我自己的getToken函數的解決方案並不是那麼糟糕...... – LB40 2009-12-04 14:51:55

相關問題