ich habe folgende yacc
Grammatik:Warnung: 2 verringern/verringern Konflikte [-Wconflicts-rr] in yacc Grammatik
%{
#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;
}
Es soll eine kleine Sprache beschreiben, die Variablen und Konstanten Deklarationen der Form ermöglicht: var:<type> <variables_names or variables_initializations>
und const:<type> <constants_initialization>
.
Ich möchte für die folgende Syntax-Unterstützung hinzufügen:
var:<type> var1, var2=<value>, var3;
Etwas wie folgt aus: var:<type> (<variables_names>|<variable_initializations>)+
.
Um das zu erreichen, dass ich die folgenden Änderungen an meine Grammatik hinzugefügt haben:
assignments
: assignment
| assignments ',' assignment
;
id_list
: ID_NAME
| id_list ',' ID_NAME
;
declaration_expression
: assignments
| id_list
| assignments ',' declaration_expression
| id_list ',' declaration_expression
;
Was ich dachte, das (<variables_names>|<variable_initializations>)+
Teil ermöglichen. Aber ich bekomme einen reduce/reduce
Konflikt aufgrund dieser Zeilen:
| assignments ',' declaration_expression
| id_list ',' declaration_expression
Was mache ich falsch?
Ich denke, Ihr erstes Snippet ist nach der nicht funktionierenden Modifikation. Wenn Sie immer noch die funktionierende Version haben, wäre es hilfreich. – rici
@rici das ist die letzte Version, die http://pastebin.com/xb9V3N8G funktioniert.Es unterstützt jedoch nur Variablen-Deklarationen der Form: 'var: | '. Es erlaubt nicht, 'Variablennamen' mit' Initialisierungen' zu mischen. –
cristid9
Ich dachte, so würde es aussehen, aber ich war mir nicht sicher. Vielen Dank. Es wäre jedoch besser, Ihre Frage zur besseren Übersicht zu bearbeiten. "Ich habe diese Definition von declaration_expression:" (von pastebin) verwendet, aber ich wollte sie so ändern, dass 'var' Deklarationen eine Liste von gemischten Elementen, entweder IDs oder Zuweisungen, sein könnten. Also änderte ich es zu: "(von der aktuellen Frage), und das gab mir Konflikte zu reduzieren/reduzieren." – rici