Ich verwende derzeit happy
zum Parsen einer Sprache, aber ich denke nicht, dass der Parser relevant ist, außer zu sagen, es ist ein LALR-Parser. Hier ist ein kleiner Auszug aus der Grammatik:Parsing mit Klammern und verschiedene Arten von Ausdrücken
ArithExpr -> ArithExpr + ArithExpr
ArithExpr -> (ArithExpr)
ArithExpr -> ...
BoolExpr -> ArithExpr == ArithExpr
BoolExpr -> (BoolExpr)
BoolExpr -> ...
Das Problem ist, dass ich immer Konflikte Verminderungs reduzieren. Ich denke, das Problem entsteht, wenn ich versuche, so etwas wie die folgenden zu analysieren:
((2 + 3) == (4 + 5))
Es gibt nur einen Weg, um diesen Ausdruck zu analysieren, aber das Problem ist, ich denke, auch bei der ersten Klammer beginnt der Parser einige Probleme hat. Der Grund dafür ist, dass der Parser nicht weiß, ob er in Zukunft mit ArithExpr
oder BoolExpr
konfrontiert wird, und da er nur einen Token Lookahead hat, muss er eine willkürliche Entscheidung treffen, die falsch sein kann.
Gibt es überhaupt eine Neuschreibung der Grammatik, um diese Sprache zu akzeptieren? Oder sollte ich wirklich nur beide ArithExpr
und BoolExpr
nur als eine einheitliche Expr
analysieren und mit den tatsächlichen Typen während der Typprüfung befassen?