【问题标题】:Optional amount of declared variables in Bison ParserBison Parser 中声明变量的可选数量
【发布时间】:2022-01-13 23:22:08
【问题描述】:

我是 bison(和 flex,我用它作为 bison 的伴侣)和一般编码的新手。我正在尝试创建一个解析器规则,该规则允许来自文件的输入,该文件允许文件可能具有的任意数量的变量。

我目前的情况是:

body:
    BEGIN optional_statement optional_statement optional_statement END ';' ;

optional_statement:
    statement |
    ;

显然,这将是一个有限的解决方案,显然我也考虑过使用循环,但我一直使用的野牛手册说“循环超出了本手册的范围”。我试过四处寻找其他野牛特定的解决方案,但无济于事。如果有人能够为我指明正确的方向来格式化此循环或其他解决方案,我将不胜感激。

这是我想要的输入类型的想法,可以有一个或十个声明:

a: boolean is true
b: integer is 21
c: integer is 7
d: integer is 18

【问题讨论】:

  • 你说的是this section of the FAQ吗?那是关于如何使用循环结构(如for 循环)实现一种语言,而不是关于如何为事物列表编写语法。手册中到处都有列表。输入中的语句列表。表达式列表,可能用于函数调用(参见recursive rules。)可能还有其他。

标签: c++ parsing bison rules


【解决方案1】:

您不能编写包含两个连续可选组件的明确语法。假设只提供一个组件:

    {   a statement;   }

这是optional_statement optional_statement optional_statement 中的第一条语句吗?或者是第二个?还是第三个?如果你真的成功地为语句列表编写了一个语法,你怎么知道列表中有多少语句,因为可能有无限数量的不可见的未实现的可选语句?

你可能会想,“但我不在乎”。很公平,但解析器确实在乎。它只能根据您提供的语法解析输入,它的工作是向您报告输入与语法匹配的方式。因此,您需要通过确保每个可能的输入最多匹配一个解析来帮助它。

无论如何,我不认为您的意思是一个块由任意数量的可选独角兽组成。您的意思是一个块由零个或多个语句组成,每个语句都存在。您可以非常简单地实现这一目标:

block: '{' list '}'
list : %empty 
     | list statement

"%empty" 是现代(甚至不那么现代)Bison 中写空右手的首选方式;在恐龙时代,通常用注释/* Empty */ 标记空白的右侧,具有相同的语义。就 yacc/bison 而言,您可以将右侧留空,但对于人类读者来说,放置可见的东西更容易,他们可能不会立即看到虚无。

这个特定的 sn-p 直接从您可以在 Bison manual 中找到的示例中很好地改编。您会发现其他常见的成语:

/* A list of ONE or more statements */
list1: statement
     | list1 statement

/* A list of one or more expressions separated by commas */
listc: expr
     | listc ',' expr
/* A list of zero or more expressions separated by commas */
opt_listc: %empty | listc

例如,最后一个是您在构造函数调用语法时通常使用的。

如果您以前从未见过或编写过上下文无关语法,那么您可能应该阅读一下。 Wikipedia 在其条目中有一些关于 Context-free grammars 的信息(和半可靠的链接),但如果你真的对这个主题感兴趣,你可能想找一本书,比如 John Levine 的 Flex 和 Bison 的优秀小指南,由 O'Reilly 的 Safari Books 出版。

【讨论】:

    猜你喜欢
    • 2019-02-04
    • 2013-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多