私は、次のしているyacc
文法:var:<type> <variables_names or variables_initializations>
:警告: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;
}
これは、フォームの変数と定数の宣言を可能にする小さな言語を記述する必要がありますおよび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
私はそれがどのように見えるのだろうと思ったが、わからなかった。ありがとう。しかし、明確にするために、あなたの質問を編集する方が良いでしょう。 "私はこの定義をdeclaration_expression:"(pastebinから)使用しましたが、 'var'宣言がIDまたは代入の混合項目のリストになるように変更したいと考えました。だから私はそれを次のように変更しました: "(現在の質問から)、それは私に紛争を減らしたり減らしたりしました。 – rici