转移/减少我的野牛语法中的冲突

时间:2013-12-20 07:58:30

标签: parsing bison

我不知道如何解决使用此语法的转换/减少冲突来实例化我的类:

%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启用时出错。我不想引入任何新的关键字,例如“属性”,这将简化决定是否转换。

1 个答案:

答案 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 {
    }
;