Ich baue gerade einen Compiler für C-. Ich arbeite gerade an dem Parser, und aus irgendeinem Grund kann ich anscheinend nicht die Kollision der ersten Sätze (der Terminal-ID) aus der EXPRESSION-Produktion auflösen. Unten, ist eine Teilmenge der Grammatik, die ich jetzt habe, könnte mir jemand in die richtige Richtung zeigen, wie man die Kollision auflöst (oder in eine äquivalente LL (1) analysierbare Grammatik umwandelt).Convert C-Grammatik zu LL (1)
EXPRESSION -> id VAR eq EXPRESSION | SIMPLEEXPRESSION
VAR -> lbracket EXPRESSION rbracket | empty
SIMPLEEXPRESSION -> ADDITIVEEXPRESSION FADDITIVEEXPRESSION
FADDITIVEEXPRESSION -> RELOP ADDITIVEEXPRESSION | empty
RELOP -> ltoreq | lt | gt | gtoreq | doubleeq | noteq
ADDITIVEEXPRESSION -> TERM ADDITIVEEXPRESSION1
ADDITIVEEXPRESSION1 -> ADDOP TERM ADDITIVEEXPRESSION1 | empty
ADDOP -> plus | minus
TERM -> FACTOR TERM1
TERM1 -> MULOP FACTOR TERM1 | empty
MULOP -> times | divide
FACTOR -> lparen EXPRESSION rparen | id FACTOR1 | num
FACTOR1 -> a | b
Versuchen Sie, so viel wie möglich zu löschen, so dass die Form Ihrer (Sub-) Grammatik erhalten bleibt und das Problem erhalten bleibt. (Erster Schritt, wirf den Rest der Grammatik weg und konzentriere dich auf das, was du uns gezeigt hast). Wenn Sie nichts anderes löschen können, ohne das Problem zu lösen, starren Sie an, was übrig ist; oft werden Sie in der Lage sein, die verbleibende Grammatik zu ändern, um das Problem zu vermeiden. Dann füge alles zurück. Wenn Sie es zu diesem Zeitpunkt nicht herausfinden können, zeigen Sie uns die abgespeckte Grammatik als Erweiterung Ihrer Frage und sagen Sie, was Sie für das Problem halten. Sie werden mehr Rat bekommen. –