Ich versuche, die Auswertung von Ausdrücken in einem Compiler zu optimieren.Wie vereinfacht man einen C-artigen arithmetischen Ausdruck, der Variablen während der Code-Generierung enthält?
Die arithmetischen Ausdrücke sind alle C-Stil, und sie können Variablen enthalten. Ich hoffe, die Ausdrücke so weit wie möglich zu vereinfachen.
Zum Beispiel kann (3+100*A*B+100)*3+100
zu 409+300*A*B
vereinfacht werden.
Es hängt hauptsächlich von dem Verteilungsgesetz, dem assoziativen Gesetz und dem Kommutativgesetz ab.
Die Hauptschwierigkeit, auf die ich stoße, ist, wie man diese arithmetischen Gesetze und traditionellen Stack-Scan-Auswertealgorithmen kombiniert.
Kann jemand Erfahrungen im Zusammenhang mit diesem oder ähnlichen Problemen im Zusammenhang mit Compiler-Erstellung teilen?
Nur '+ - * /' und Klammern? –
@CaseyChu Tatsächlich können alle C-Operatoren angezeigt werden. Aber ich denke, nur + - * /() ist akzeptabel. Ich versuche mein Bestes, um sie zu vereinfachen. – konjac
Sie müssen wahrscheinlich ein [Rewriting-System] (http://en.wikipedia.org/wiki/Rewriting) entwickeln, das nacheinander Rewriting-Regeln auf den Ausdruck anwenden würde. Bevor Sie das tun, können Sie sich einen vorhandenen Compiler-Quellcode ansehen, um zu sehen, wie er mit solchen Optimierungen umgeht. Ich habe gehört, dass der LLVM-Quellcode sehr gut lesbar ist. –