Bison Parser中声明变量的可选数量



我对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

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

{   a statement;   }

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

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

不管怎样,我不认为你的意思是一个区块由任意数量的可选独角兽组成。您的意思是,一个块由零个或多个语句组成,每个语句都存在。你可以很简单地做到这一点:

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

"CCD_ 2";是现代(甚至不那么现代(野牛书写右手边空白的首选方式;在恐龙时代,用注释/* Empty */标记空的右手边是很常见的,具有相同的语义。就yacc/bison而言,你可以把右手边留空,但对于人类读者来说,放一些可见的东西更容易,他们可能不会立即看到虚无。

这个特定的片段直接从Bison手册中的例子中改编得很好。你会发现其他常见的习语:

/* 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

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

如果你以前从未见过或写过上下文无关的语法,你可能应该读一读。维基百科在其条目中有一些关于上下文无关语法的信息(和半可靠的链接(,但如果这个主题真的让你感兴趣,你可能想找一本书,比如约翰·莱文的优秀小指南《Flex和Bison》,由奥莱利的Safari Books出版。

相关内容

  • 没有找到相关文章

最新更新