Zum Beispiel erzeugt Laufen ich den Code habenUnexpected Syntaxfehler erzeugt durch YACC Parser
%nonassoc lower
%nonassoc ELSE
if_stmt: IF '(' expr ')' statement %prec lower
{
/*some code*/
}
| IF '(' expr ')' statement ELSE statement
{
/*some code*/
}
;
Mit den Regeln und der Code (die nicht viel tun) ich jetzt bekommen „elsesyntaxFehler“, wenn Ich teste eine IF-ELSE-Anweisung. Wenn es nur eine IF-Anweisung ist, funktioniert es gut.
Ich dachte, dass ich etwas in der zweiten Aktion übergeben sollte, damit es funktioniert, aber ich bin mir nicht sicher was.
Wenn möglich, möchte ich die 2 Aktionen nicht trennen.
EDIT: Also hier ist die Grammatik wie gefragt, und die Priorität: EDIT2: implementiert meine Grammatikregeln. compound_stmt und local_declarations sind Kommentare, weil ich noch nicht weiß, was ich mit ihnen machen soll.
%nonassoc islowerthanelse
%nonassoc ELSE
%%
%token <intVal> NUM WHILE PRINT IF ELSE INT
program : declaration_list statement_list
{
printf("/0\n");
}
;
declaration_list : declaration_list declaration
{
printf("/1\n");
$$ = make_node(DeclSeq, NULL, $1, $2, NULL, NULL);
}
|declaration
{
printf("/2\n");
$$ = $1;
}
;
declaration : type_specifier ID ';'
{
printf("/3\n");
$$ = make_node(Decl, p3, $1, NULL, NULL, NULL);
}
type_specifier : INT
{
printf("/5\n");
$$ = make_node(INT, NULL, NULL, NULL, NULL, NULL);
}
;
statement_list : statement_list statement
{
printf("/6\n");
$$ = make_node(StmtSeq, NULL, $1, $2, NULL, NULL);
}
|/* EMPTY */
{
printf("/7\n");
$$ = make_node(astEmptyStmtSeq, NULL, NULL, NULL, NULL, NULL);
}
;
statement : expression_stmt
{
printf("/8\n");
$$ = $1;
}
/*|compound_stmt
{
$$ = $1;
}*/
|selection_stmt
{
$$ = $1;
}
|iteration_stmt
{
$$ = $1;
}
|print_stmt
{
printf("/12\n");
$$ = $1;
}
;
/*compound_stmt : '{' local_declarations statement_list '}'
;
local_declarations : local_declarations declaration
|/* EMPTY *\
;*/
expression_stmt : expression ';'
{
printf("/15\n");
$$ = make_node(ExprStmt, NULL, $1, NULL, NULL, NULL);
}
|/* EMPTY */ ';'
{
printf("/16\n");
$$ = make_node(EmptyExprStmt, NULL, NULL, NULL, NULL, NULL);
}
;
selection_stmt : IF '(' expression ')' statement %prec islowerthanelse
{ printf("/256\n");
$$ = make_node(IfStmt, NULL, $3, $5, NULL, NULL);
}
|IF '(' expression ')' statement ELSE statement
{printf("/257\n");
$$ = make_node(IfElseStmt, NULL, $3, $5, $7, NULL);
}
;
iteration_stmt : WHILE '(' expression ')' statement
{
$$ = make_node(astWhileStmt, NULL, $3, $5, NULL, NULL);
}
;
Diagnostizieren yacc/Bison Grammatik Probleme ist fast unmöglich, ohne die vollständige Grammatik zu sehen. Sie müssen eine [MVCE] (http://stackoverflow.com/help/mcve) veröffentlichen, wenn Sie nützliche Hilfe erhalten möchten. –
Ich denke, Ihr "Grammatik und Vorrang" -Abschnitt zeigt, was Sie implementieren sollen, während das Problem in dem ist, was Sie implementieren. Wir müssen wahrscheinlich eine minimale Version Ihrer Yacc-Grammatik sehen, die das Problem reproduziert (siehe [MCVE]). Das Problem tritt zur Laufzeit auf, glaube ich. Das heißt, Ihre Grammatik kompiliert und die Programmverknüpfungen, aber Sie erhalten einen unerwünschten Fehler, wenn Sie es auf einer IF/ELSE-Anweisung ausführen - ist das richtig? –
@JonathanLeffler Ich verbinde nicht etwas, ist das falsch? Ich lexiere den Lexer, yacc den Parser, gcc die .c-Dateien und mit der .exe-Datei habe ich Code zum Testen hinzugefügt. – codeNewbie