ich Bison verwenden soll einige Skriptsprache zu analysieren, in dieser Sprache kann ich Code wie folgt schreiben:Wie kann ich shift-reduce Konflikte vom selben Betreiber beseitigen
a = input()
b = a + 1
function myfunc
a = input()
b = a + 1
end function
fand ich, dass der Block
a = input()
b = a + 1
, die sowohl in die und aus der Funktionsdefinition erscheinen stmts
, durch die gleiche Regel reduziert werden, so schreibe ich Code wie folgt
%{
#include <stdio.h>
#include <string>
#include <sstream>
#include <iostream>
#include <stdarg.h>
#include <tuple>
using namespace std;
%}
%debug
%token CRLF EXP FUNCTIONBEGIN FUNCTIONEND
%start program
%%
stmt : EXP
|
stmts : stmt CRLF stmts
| stmt
function : FUNCTIONBEGIN CRLF stmts CRLF FUNCTIONEND
unit : function
| stmts
program : unit
| unit CRLF program
%%
Natürlich kann dieser Code nicht aufgrund einer Schichtarbeit/reduzieren Konflikt
State 3
3 stmts: stmt . CRLF stmts
4 | stmt .
CRLF shift, and go to state 9
CRLF [reduce using rule 4 (stmts)]
$default reduce using rule 4 (stmts)
Ich dachte, dieser Konflikt ist darauf zurückzuführen, sowohl meine program
Regel und stmts
Regel unter Verwendung der gleichen Klemme CRLF
als „Binäroperators“ Daher kann ich diesen Konflikt nicht lösen, indem ich den Operatoren Priorität einräume.
Vielleicht kann ich program
Regel und stmts
Regel zusammen irgendwie verschmelzen durch zwei weitere Regeln hinzufügen
stmts : function CRLF stmts
| function
stmt Jedoch habe ich diese Methode gedacht (ob es praktisch arbeiten) ist nicht sehr schön, so frage ich, wenn Es gibt einige andere Lösungen