2016-06-07 51 views
2

我在yacc中編寫我的第一個解析器。我想分析的是具有3「模式」文件:使用yacc的模態解析器

  • 聲明模式
  • 表標題模式
  • 錶行模式

我希望我的解析器在聲明中開始了模式,然後當它看到由負號組成的一行時,切換到表格標題模式。當它看到的減號另一條線,切換到錶行模式,它看到最後當第三組的減號切換到發言模式:

是occures給我,
statement... 
statement... 
statement... 
---- 
table heading 
---- 
table row 
table row 
table row 
---- 
statement 
statement 
statement 

一件事是,我能有3個獨立的語法,我將在我的line feed loop之間切換。但是,我不知道如何在一個.y文件中創建多個文法。

看起來像是一種可能性的另一件事是使用"Lexical Tie-ins"(不幸的是,您必須在文檔中搜索該字符串)。然而,yacc教程的作者並沒有真正告訴我任何關於這些「詞法聯繫」的內容,除了「這種」後門「方法可以被闡述到有害的程度之外。然而,它代表了一種方式做一些困難的事情,如果不是不可能的話,做其他事情。「這並不令人鼓舞。

+1

這看起來並不像它野牛isthe答案一門語言,但沒有描述的結構「模式」,所以我可能是錯的。在(f)lex中切換詞法模式是很容易的;只需在Flex手冊中搜索起始條件即可。這可能是你所需要的。 – rici

回答

0

我已經通過創建我插入使用詞法分析器僞符號解決了這個問題:

line 
    : TABLE_HEADING sentences ',' table_heading_columns ',' sentences 
    { 
     fmt.Println("TABLE_HEADING") 
    } 
    | TABLE_BODY table_body_columns 
    { 
     fmt.Println("TABLE_BODY") 
    } 
    | STATEMENT sentences 
    { 
     fmt.Println("STATEMENT") 
    } 
    ;