我正在为输出C / C ++代码的解析器生成器定义自己的语法。我为此选择了Bison,但遇到了问题。我想在规则中使用括号("(",")")但是Bison不接受它们。例如,声明我使用的字符(三个)点代替所有其他可能的ASCII字符):
character: "'" ("\0" | "\t" | "\n" | " " | "!" | ... | "}" | "~") "'";
如您所见,我使用括号表示某个字符必须带引号,任何字符,然后是另一个引号。
我为整数做了类似的事情:
integer: (["-"] digits) | "0";
在Bison有没有办法实现类似的东西?或者,是否有一个解析器生成器接受EBNF,甚至只是括号并输出c ++代码?
答案 0 :(得分:5)
Bison不支持EBNF,只支持BNF,所以如果你想要可选或分组的东西,你必须自己编写规则:
character: '\'' character_char '\''
character_char: '\0' | '\t' | ...
integer: opt_negate digits | '0'
opt_negate: | '-'
另外,请注意,野牛中的"
个字符不代表文字,因此不会做你想要的(并且通常没用,因为你可以轻松地引用它们在词法分析器中)。始终使用'
- 单引号 - 用于文字。
此外,正则表达式可以识别的任何内容(如这些示例)都应该在词法分析器中被识别并作为单个标记返回到bison解析器 - 它更简单,更清晰,而且效率更高。