2016-06-07 96 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") 
    } 
    ;