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