【问题标题】:Using brackets/parentheses in EBNF or GNU Bison grammar在 EBNF 或 GNU Bison 语法中使用方括号/圆括号
【发布时间】:2014-12-14 22:20:41
【问题描述】:

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

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

如你所见,我用方括号表示一个字符必须有引号,任何一个字符,然后是另一个引号。

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

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

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

【问题讨论】:

  • 通常情况下,词法分析应该在flex中完成

标签: c++ parsing syntax grammar bison


【解决方案1】:

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

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

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

另外,请注意,bison 中的 " 字符不表示文字,因此不会执行您想要的操作(并且通常无用,因为您无法在词法分析器中轻松引用它们)。始终使用 ' -- 单引号 -- 作为文字。

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

【讨论】:

    猜你喜欢
    • 2011-01-12
    • 1970-01-01
    • 1970-01-01
    • 2021-03-14
    • 1970-01-01
    • 2014-01-11
    • 2021-01-11
    • 2014-04-23
    相关资源
    最近更新 更多