我有以下Bison文件 -
%union
{
int integer_value;
double double_value;
char* string_value;
}
%token <integer_value> INTEGER
%token <string_value> VAR
%token <string_value> INTEGER_DECLARATION
%token <double_value> DOUBLE
%token <string_value> DOUBLE_DECLARATION
%%
program:
program statement '\n'
|
;
statement:
| INTEGER_DECLARATION VAR '=' INTEGER {//implementation}
| INTEGER_DECLARATION VAR '=' DOUBLE {//implementation as above}
%%
由于INTEGER_DECLARATION VAR '=' INTEGER
和INTEGER_DECLARATION VAR '=' DOUBLE
中的实现相同,是否可以在语句结构中使OR
条件为bw INTEGER
和DOUBLE
?
我尝试INTEGER_DECLARATION VAR '=' INTEGER|DOUBLE
但提示warning: rule useless in parser due to conflicts: statement: DOUBLE
,实际上忽略了对DOUBLE
的引用。
答案 0 :(得分:1)
您发布的主要代码段尽可能简明扼要。 statement: INTEGER_DECLARATION VAR '=' INTEGER|DOUBLE
试图说statement
只能包含DOUBLE
。
你可以这样写:
program:
program statement '\n'
|
;
statement:
decl_part INTEGER {//implementation uses info in $1}
| decl_part DOUBLE {//implementation as above}
;
decl_part:
INTEGER_DECLARATION VAR '=' {//partial implementation passes some info via $$}
;
但这是否会改善你已经拥有的东西是值得商榷的。
或者你可以写:
program:
program statement '\n'
|
;
statement:
INTEGER_DECLARATION VAR '=' number
;
number:
INTEGER
| DOUBLE
;
当您稍后想要扩展语言(例如,支持十六进制常量)时,此技术具有优势。
另一个注意事项:我认为你不想在statement
的作品中使用第一个替换符号。你拥有它的方式,program
和statement
都可以是epsilon(空),我相信这会导致解析器冲突。