在EBNF或GNU Bison语法中使用括号/括号

时间:2014-12-14 22:20:41

标签: c++ parsing syntax grammar bison

我正在为输出C / C ++代码的解析器生成器定义自己的语法。我为此选择了Bison,但遇到了问题。我想在规则中使用括号("(",")")但是Bison不接受它们。例如,声明我使用的字符(三个)点代替所有其他可能的ASCII字符):

character: "'" ("\0" | "\t" | "\n" | " " | "!" | ... | "}" | "~") "'";

如您所见,我使用括号表示某个字符必须带引号,任何字符,然后是另一个引号。

我为整数做了类似的事情:

integer: (["-"] digits) | "0";

在Bison有没有办法实现类似的东西?或者,是否有一个解析器生成器接受EBNF,甚至只是括号并输出c ++代码?

1 个答案:

答案 0 :(得分:5)

Bison不支持EBNF,只支持BNF,所以如果你想要可选或分组的东西,你必须自己编写规则:

character: '\'' character_char '\''
character_char: '\0' | '\t' | ...

integer: opt_negate digits | '0'
opt_negate: | '-'

另外,请注意,野牛中的"个字符不代表文字,因此不会做你想要的(并且通常没用,因为你可以轻松地引用它们在词法分析器中)。始终使用' - 单引号 - 用于文字。

此外,正则表达式可以识别的任何内容(如这些示例)都应该在词法分析器中被识别并作为单个标记返回到bison解析器 - 它更简单,更清晰,而且效率更高。