Ich habe die folgende bekam Glückliche Grammatik (stark abgespeckte)Shift/reduce-Konflikt in Happy Grammatik
%token
'{' { Langle }
'}' { Rangle }
'..' { DotDot }
'::' { ColonColon }
'@' { At }
mut { Mut }
ident { Ident }
%%
pattern
: binding_mode ident at_pat { error "identifier pattern" }
| expr_path { error "constant expression" }
| expr_path '{' '..' '}' { error "struct pattern" }
binding_mode
: mut { }
| { }
at_pat
: '@' pat { }
| { }
expr_path
: expr_path '::' ident { }
| ident { }
Welche Verschiebung/reduzieren Konflikte um Identifikatoren in Muster hat. Standardmäßig wählt Happy die Verschiebung, aber in diesem Fall ist das nicht, was ich will: es versucht, alles in constant expression
zu schuhen, selbst wenn es ein identifier pattern
sein könnte.
Ich habe gelesen, dass Präzedenz/Assoziativität der Weg ist, um diese Art von Problem zu lösen, aber nichts, was ich hinzugefügt habe, war in der Lage, die Grammatik in die richtige Richtung zu bewegen (um fair zu sein, habe ich meistens genommen Aufnahmen im Dunkeln).
einige offensichtliche tokenization verwenden, würde ich gerne haben:
x
identifier pattern
mut x
erhaltenidentifier pattern
std::pi
zu erhaltenconstant expression
point{..}
zu erhaltenstruct pattern
- zu ergeben
struct pattern
Grundsätzlich zu erhalten, es sei denn, ein {
oder ::
Token warten verbraucht wird, sollte eine Kennung zum identifier pattern
Fall gehen.
Ich entschuldige mich, wenn meine Frage nicht klar ist - ein Teil des Problems ist, dass ich eine harte Zeit Ortung habe, was das Problem selbst ist. :(
Ich glaube, Sie haben einige der Produktionen verpasst. Wie dargestellt, gibt es keinen Konflikt (und keinen konstanten Ausdruck) – rici
@rici Das kann sehr wohl der Fall sein. Wenn dies der Fall ist, lösche ich die Frage und überprüfe sie genauer, bevor ich sie erneut posten kann! Es soll keine "Konstanten_Ausdruck" -Produktion geben - das ist nur die Nachricht, die ich gewählt habe, nachdem ich die 'expr_path'-Variante von' pattern' gefunden habe. Und ich denke, dass es mindestens einen Shift/Reduce-Konflikt geben sollte - gegeben nur eine 'Ident', kann ich von' pattern' in die 'expr_path' Variante wechseln, oder 'binding_mode ident at_pat' reduzieren. – Alec
Ok, es wäre für mich klarer gewesen, hätten Sie die Ergebnisse als Produktionen und nicht als Aktionen charakterisiert; Ich neige dazu, Aktionen zu ignorieren. Ist es Ihre Absicht, dass ein schmuckloser Bezeichner ein Muster ist? Warum schreibst du nicht einfach die Grammatik, um das zu sagen? – rici