我不知道如何解决使用此语法的转换/减少冲突来实例化我的类:
%start root_instance
%token IDENTIFIER
%token FUNCTION
%token FUNCTION_CHUNK
%token NOBIND
%token PROPERTY_CHUNK
%token MULTILINE_PROPERTY_CHUNK
%%
id_comma_list:
id_comma_list IDENTIFIER {
}
| id_comma_list ',' IDENTIFIER {
}
| %empty { $$ = id_list(); }
;
id_dot_list:
id_dot_list IDENTIFIER {
}
| id_dot_list '.' IDENTIFIER {
}
| %empty { $$ = id_list(); }
;
root_instance:
id_dot_list '{' instance_body '}' {
}
;
instance:
id_dot_list '{' instance_body '}' {
}
;
instance_body:
instance_body instance {
}
| instance_body function {
}
| instance_body property {
}
| %empty { $$ = node(); }
;
function:
FUNCTION IDENTIFIER '(' id_comma_list FUNCTION_CHUNK {
}
;
property:
IDENTIFIER PROPERTY_CHUNK {
}
| IDENTIFIER MULTILINE_PROPERTY_CHUNK {
}
| IDENTIFIER NOBIND PROPERTY_CHUNK {
}
| IDENTIFIER NOBIND MULTILINE_PROPERTY_CHUNK {
}
;
%%
冲突出现在“instance_body”规则中。解析器无法决定是将IDENTIFIER转换为“property”还是降低为“id_dot_list”。我试图启用GLR
解析器,它可能会解析这个语法,但bison
中有一个错误,导致GLR
启用时出错。我不想引入任何新的关键字,例如“属性”,这将简化决定是否转换。
答案 0 :(得分:0)
这似乎是这样做的,当IDENTIFIER
出现时,将强制转换,解决冲突:
%start root_instance
%token IDENTIFIER
%token FUNCTION
%token FUNCTION_CHUNK
%token NOBIND
%token PROPERTY_CHUNK
%token MULTILINE_PROPERTY_CHUNK
%%
id_comma_list:
id_comma_list IDENTIFIER {
}
| id_comma_list ',' IDENTIFIER {
}
| %empty { $$ = id_list(); }
;
id_dot_list:
id_dot_list IDENTIFIER {
}
| id_dot_list '.' IDENTIFIER {
}
| %empty { $$ = id_list(); }
;
root_instance:
id_dot_list '{' instance_body '}' {
}
;
instance_or_property:
id_dot_list '{' instance_body '}' {
}
| property {
}
;
instance_body:
instance_body IDENTIFIER instance_or_property {
$$ = ::std::move($1);
}
| instance_body function {
}
| %empty { $$ = node(); }
;
function:
FUNCTION IDENTIFIER '(' id_comma_list FUNCTION_CHUNK {
}
;
property:
PROPERTY_CHUNK {
}
| MULTILINE_PROPERTY_CHUNK {
}
| NOBIND PROPERTY_CHUNK {
}
| NOBIND MULTILINE_PROPERTY_CHUNK {
}
;