使用 yacc 的模态解析器

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

  • 语句模式

  • 表格标题模式

  • 表格行模式

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

statement...

statement...

statement...

----

table heading

----

table row

table row

table row

----

statement

statement

statement

我想到的一件事是,我可以有 3 个单独的语法,我可以在换行循环中切换它们。但是,我不知道如何在一个.y文件中创建多个语法。


另一件看起来可能的事情是使用“Lexical Tie-ins”(不幸的是,您必须在文档中搜索该字符串)。然而,yacc 教程的作者并没有真正告诉我关于这些“词法关联”的任何信息,只是说“这种‘后门’方法可以被详细阐述到有害的程度。不过,它代表了一种方式做一些很难做的事情,如果不是不可能做的话。” 这很难令人鼓舞。


沧海一幻觉
浏览 107回答 1
1回答

侃侃尔雅

我通过创建使用词法分析器插入的伪符号解决了这个问题: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")    }    ;
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go