我有以下yacc
語法:警告:2減少/減少衝突[-Wconflicts-RR]在yacc語法
%{
#include <stdio.h>
extern FILE* yyin;
extern char* yytext;
%}
%token VAR ID_NAME TYPE_STRING TYPE_BOOL TYPE_NUMBER
%token CONST VALUE_STRING VALUE_BOOL VALUE_NUMBER
%%
program
: declarations
;
declarations
: declaration
| declarations declaration
;
declaration
: var_declaration
| const_declaration
;
value
: VALUE_BOOL
| VALUE_STRING
| VALUE_NUMBER
;
assignment
: ID_NAME '=' value
;
assignments
: assignment
| assignments ',' assignment
;
id_list
: ID_NAME
| id_list ',' ID_NAME
;
declaration_expression
: assignments
| id_list
| assignments ',' declaration_expression
| id_list ',' declaration_expression
;
var_declaration
: VAR ':' type declaration_expression ';' { printf("%s var\n", $1); }
;
const_declaration: CONST ':' type assignments ';' {printf("const\n");}
;
type: TYPE_NUMBER
| TYPE_STRING
| TYPE_BOOL
;
%%
void yyerror (char const *s) {
fprintf (stderr, "%s\n", s);
}
int main(int argc, char** argv[])
{
yyparse();
return 0;
}
它應該描述一個小語言,使形式的變量和常量聲明:var:<type> <variables_names or variables_initializations>
和const:<type> <constants_initialization>
。
我想補充以下語法的支持:
var:<type> var1, var2=<value>, var3;
事情是這樣的:var:<type> (<variables_names>|<variable_initializations>)+
。
爲了實現這個目標我已經添加了以下修改我的語法:
assignments
: assignment
| assignments ',' assignment
;
id_list
: ID_NAME
| id_list ',' ID_NAME
;
declaration_expression
: assignments
| id_list
| assignments ',' declaration_expression
| id_list ',' declaration_expression
;
而且我認爲他將啓用(<variables_names>|<variable_initializations>)+
部分。但我得到一個reduce/reduce
衝突,因爲這些行:
| assignments ',' declaration_expression
| id_list ',' declaration_expression
我在做什麼錯?
我想你的第一個片段是不工作的修改之後。如果你仍然有工作版本踢,那會很有幫助。 – rici
@rici這是http://pastebin.com/xb9V3N8G的最新版本。但是,它只支持格式的變量聲明:'var: | <初始化>'。它不允許混合'variables_names'和'initializations'。 –
cristid9
我認爲這是它的樣子,但我不確定。謝謝。爲了清晰起見,編輯你的問題會更好。 「我使用了這個declarative_expression的定義:」(來自pastebin),但我想改變它,以便'var'聲明可以是混合項的列表,可以是ID或賦值。所以我把它改爲:「(從當前的問題),這讓我減少/減少衝突。 – rici