Parsing 使用yacc的模态分析器

Parsing 使用yacc的模态分析器,parsing,go,yacc,Parsing,Go,Yacc,我正在用yacc编写我的第一个解析器。我想解析一个有3种“模式”的文件: 语句模式 表格标题模式 表行模式 我希望我的解析器以语句模式开始,然后当它看到由减号组成的行时,切换到表标题模式。当它看到另一行减号时,切换到表行模式,最后当它看到第三组减号时,切换到语句模式: statement... statement... statement... ---- table heading ---- table row table row table row ---- statement state

我正在用yacc编写我的第一个解析器。我想解析一个有3种“模式”的文件:

  • 语句模式
  • 表格标题模式
  • 表行模式
我希望我的解析器以语句模式开始,然后当它看到由减号组成的行时,切换到表标题模式。当它看到另一行减号时,切换到表行模式,最后当它看到第三组减号时,切换到语句模式:

statement...
statement...
statement...
----
table heading
----
table row
table row
table row
----
statement
statement
statement
我想到的一件事是,我可以有3个独立的语法,我可以在我的。但是,我不知道如何在一个
.y
文件中创建多个语法


另一种可能性是使用(不幸的是,您必须在文档中搜索该字符串)。然而,yacc教程的作者并没有真正告诉我关于这些“词汇连接”的任何事情,除了“这种‘后门’的方法可以被阐述到有害的程度。然而,它代表了一种做一些事情的方式,如果不是不可能的话,那么这些事情是很难做的。”这很难令人鼓舞。

我通过创建伪符号解决了这个问题,我使用lexer插入了伪符号:

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")
    }
    ;

这看起来不像是一种以野牛为答案的语言,但你没有描述“模式”的结构,所以我可能错了。在(f)lex中切换词法模式很容易;只需在flex手册中搜索开始条件。这可能就是你所需要的。