Die Aufgabe eines Fehlerparsers ist die Erkennung von Warnungen, Fehlern und anderen wichtigen Nachrichten in der Ausgabe des Compilers oder Build-Tools und die Erstellung von sogenannten "Problemmarkierungsobjekten" für diese. Eclipse zeigt Problemmarkierungen als Fehler- oder Warnsymbol im Projektexplorer und in der Problemsicht sowie im Editor an.

IBM Rational Developer for Power Systems Software erkennt Buildfehler möglicherweise nicht, wenn Sie ein Build-Tool oder einen Compiler verwenden, das bzw. der zurzeit nicht unterstützt wird. Ist dies der Fall, empfiehlt es sich möglicherweise, ein eigenes Fehlerparser-Plug-in zu schreiben, das eine bessere Integration in Ihr Build-Tool ermöglicht.
Der erste Schritt besteht darin, eine Umgebung für das Schreiben von Plug-ins einzurichten. Dies ist im Abschnitt Erweiterung mit Plug-ins erläutert. Wenn Sie Ihre Umgebung eingerichtet haben, fahren Sie bitte mit dem folgenden Lerntext fort. In diesem Text ist beschrieben, wie Sie einen Fehlerparser erstellen.
Wählen Sie Datei > Neu > Projekt aus. Daraufhin wird der Auswahldialog des Assistenten Neues Projekt angezeigt. In diesem Dialog wählen Sie Plug-in-Projekt aus und klicken auf Nächste.

Geben Sie einen Namen für Ihr Projekt ein. Für Plug-in-Namen gelten in der Regel dieselben Namenskonventionen wie für Java-Pakete.
Im Abschnitt Zielplattform stellen Sie sicher, dass die Eclipse-Version 3.4 ausgewählt ist. Dies ist die Eclipse-Version, auf der die IBM Rational Developer for Power Systems Software zurzeit basiert. Eine höhere Version funktioniert nicht.

Klicken Sie auf Nächste, um die zweite Seite des Assistenten aufzurufen.
Inaktivieren Sie auf der zweiten Seite des Assistenten das Kontrollkästchen 'Plug-in ergänzt Benutzerschnittstelle'. Für diesen Lerntext werden keine Benutzerschnittstellenkomponenten entwickelt.
Das Kontrollkästchen 'Aktivator generieren' sollten Sie aktiviert lassen. Dadurch wird eine Aktivatorklasse erstellt, die verwendet wird, um auf Ereignisse im Lebenszyklus des Plug-ins zu reagieren. Für diesen Lerntext ist es nicht erforderlich, auf diese Ereignisse zu reagieren. Bei den meisten in der Praxis verwendeten Plug-ins müssen Sie jedoch auf diese Ereignisse reagieren; daher wird empfohlen, diese Klasse jetzt zu generieren, auch wenn sie zum jetzigen Zeitpunkt nicht erforderlich ist.

Klicken Sie auf Fertig stellen.
Im Paketexplorer wechseln Sie zu dem neu erstellen Projekt, öffnen den Ordner META-INF und klicken doppelt auf die Datei MANIFEST.MF.

Daraufhin wird der Editor für Plug-in-Manifest geöffnet, mit dem die Metadaten des Plug-ins konfiguriert werden. Klicken Sie unten im Editor auf die Registerkarte Abhängigkeiten.

Sie müssen zwei Plug-in-Abhängigkeiten hinzufügen, damit Sie auf die APIs zugreifen können, die zum Schreiben eines Fehlerparsers erforderlich sind. Klicken Sie zunächst auf die Schaltfläche Hinzufügen unter Erforderliche Plug-ins. Daraufhin wird der Dialog Plug-in-Auswahl geöffnet. Geben Sie org.eclipse.cdt.core in das Filterfeld ein, wählen Sie dieses Plug-in aus und klicken Sie auf 'OK'. Führen Sie diesen Prozess jetzt noch einmal aus und fügen Sie das Plug-in org.eclipse.core.resources hinzu.

Die erforderlichen Plug-ins sollten jetzt etwa wie im Folgenden dargestellt aussehen. Speichern Sie Ihre Änderungen.

Nun müssen Sie eine Java-Klasse erstellen, die den Code für den Fehlerparser enthält. Erweitern Sie den Ordner src im Paketexplorer. Dort finden Sie ein Java-Paket, das automatisch für Sie erstellt wurde. Klicken Sie mit der rechten Maustaste auf das Paket und wählen Sie Neu > Klasse aus.

Daraufhin wird der Assistent Neue Java-Klasse geöffnet. Geben Sie einen Namen für die Klasse an, beispielsweise "MyErrorParser".

Klicken Sie auf die Schaltfläche Hinzufügen neben dem Abschnitt für Schnittstellen. Daraufhin wird der Dialog Implementierte Schnittstellen auswählen geöffnet. Geben Sie 'IErrorParser' in das Filterfeld ein und wählen Sie die Schnittstelle IErrorParser aus.

Klicken Sie auf Fertig stellen. Daraufhin wird eine neue Klasse für Ihren Fehlerparser mit einer Rumpfimplementierung der Methode processLine() erstellt.

Bevor Sie den Code schreiben, sollten Sie sicherstellen, dass der neue Fehlerparser von der IBM Rational Developer for Power Systems Software erkannt wird. Öffnen Sie den Editor für Plug-in-Manifest erneut und klicken Sie unten auf die Registerkarte Erweiterungen.

Klicken Sie auf die Schaltfläche Hinzufügen, um den Dialog Neue Erweiterung zu öffnen. Wählen Sie den Erweiterungspunkt org.eclipse.cdt.core.ErrorParser aus und klicken Sie auf Fertig stellen.

Die Erweiterung org.eclipse.cdt.core.ErrorParser sollte jetzt im Abschnitt Alle Erweiterungen angezeigt werden.

Klicken Sie auf die Registerkarte plugin.xml unten, um die Datei plugin.xml im Editor zu öffnen. Editieren Sie die Datei so, dass der Hauptteil der Datei in etwa wie folgt aussieht.
<plugin>
<extension
id="org.mycompany.errorparser.MyErrorParser"
name="Test Error Parser"
point="org.eclipse.cdt.core.ErrorParser">
<errorparser
class="org.mycompany.errorparser.MyErrorParser">
</errorparser>
</extension>
</plugin>
Das Klassenattribut des Elements <errorparser> muss den vollständig qualifizierten Namen der Klasse enthalten, die die Schnittstelle IErrorParser implementiert.
Zu diesem Zeitpunkt empfiehlt es sich, zu testen, ob die IBM Rational Developer for Power Systems Software den neuen Fehlerparser erkennt. Starten Sie die IBM Rational Developer for Power Systems Software mit der Ausführungskonfiguration, deren Erstellung im Abschnitt Erweiterung mit Plug-ins beschrieben wurde. Wechseln Sie in der IBM Rational Developer for Power Systems Software zu der Perspektive Fernes C/C++. Falls im Arbeitsbereich noch kein Projekt enthalten ist, erstellen Sie ein Projekt.
Klicken Sie mit der rechten Maustaste auf ein Projekt und öffnen Sie die Projektmerkmale. Navigieren Sie zu C/C++-Build > Einstellungen. Auf der Registerkarte Fehler-Parser sollte Ihr neuer Fehlerparser aufgelistet sein. Klicken Sie auf das Kontrollkästchen neben dem Parser, um ihn zu aktivieren, und verschieben Sie ihn nach oben, sodass er gegenüber den anderen Fehlerparsern Vorrang hat. Möglicherweise empfiehlt es sich auch, alle anderen Fehlerparser zu inaktivieren, während Sie entwickeln. Klicken Sie auf 'OK'.

Jetzt sollten Sie damit beginnen, den Code für den Fehlerparser zu schreiben.
Bei jedem Build wird die Ausgabe des Erstellungsbefehls zeilenweise nacheinander dem Fehlerparser zugeführt. Die Methode processLine() wird für jede Ausgabezeile einmal aufgerufen. An diese Methode werden zwei Argumente übergeben: eine Zeichenfolge, die die Ausgabezeile enthält, und ein Verweis auf den ErrorParserManager. Das Managerobjekt verfügt über einige Methoden zur Vereinfachung, die bei der Erstellung von Problemmarkierungsobjekten helfen.
Das normale Verhaltensmuster ist, dass versucht wird, jede Zeile als Warnung oder Fehlernachricht des Compilers zu erkennen. Dazu ist es sinnvoll, die Zeile mit einem regulären Ausdruck zu vergleichen und Erfassungsbereiche zu verwenden, um relevante Teile der Zeile zu extrahieren, z. B. den Dateinamen, die Zeilennummer und die Fehlernachricht.
Wie der Fehlerparser geschrieben wird, ist vom verwendeten Build-Tool und Compiler abhängig. Im Folgenden finden Sie eine Beispielimplementierung, die Fehlernachrichten vom Compiler IBM XLC erkennt.
package org.mycompany.errorparser;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.eclipse.cdt.core.ErrorParserManager;
import org.eclipse.cdt.core.IErrorParser;
import org.eclipse.cdt.core.IMarkerGenerator;
import org.eclipse.core.resources.IResource;
public class MyErrorParser implements IErrorParser {
static String regexp = "\"((?:\\w|\\.)+)\", line (\\d+)\\.\\d+: (.*)";
static Pattern errorPattern = Pattern.compile(regexp);
public boolean processLine(String line, ErrorParserManager manager) {
Matcher matcher = errorPattern.matcher(line);
if(!matcher.matches())
return false;
String fileName = matcher.group(1);
int lineNumber = Integer.parseInt(matcher.group(2));
String message = matcher.group(3);
IResource resource = manager.findFileName(fileName);
if(resource == null)
resource = manager.findFilePath(fileName);
if(resource == null)
resource = manager.getProject(); // Datei nicht im Arbeitsbereich gefunden, Problem zu Projekt hinzufügen
// Problemmarkierung erstellen, die in der Problemsicht angezeigt wird
int severity = IMarkerGenerator.SEVERITY_ERROR_RESOURCE;
manager.generateMarker(resource, lineNumber, message, severity, null);
return true;
}
}
Zuerst wird die Zeile mit dem regulären Ausdruck abgeglichen. Liegt keine Übereinstimmung vor, wird 'false' zurückgegeben. Dies teilt dem ErrorParserManager mit, dass dieser Fehlerparser die Zeile nicht erkannt hat. In diesem Fall leitet der ErrorParserManager die Zeile an den nächsten Fehlerparser in der Reihenfolge weiter.
Stimmt die Zeile nicht mit dem Ausdruck überein, ist es die Aufgabe des Fehlerparsers, eine sogenannte "Problemmarkierung" zu erstellen, die Eclipse dem Benutzer anzeigt. In diesem Beispiel werden Erfassungsgruppen verwendet, um die relevanten Informationen aus der Zeile zu extrahieren. Eine ausführliche Beschreibung zu regulären Ausdrücken und Erfassungsgruppen finden Sie in den Javadocs für die Klasse java.util.regex.Pattern. Wenn Sie keine regulären Ausdrücke verwenden wollen, enthält die Klasse 'String' mehrere nützliche Methoden für die Syntaxanalyse von Zeichenfolgen, ebenso wie die Klasse java.util.StringTokenizer.
Im nächsten Schritt wird eine IResource gesucht, die mit dem Dateinamen in der Fehlernachricht übereinstimmt. Ein IResource-Objekt stellt eine Datei oder ein Verzeichnis im Eclipse-Arbeitsbereich dar. (Weitere Informationen finden Sie in den Javadocs für die Schnittstelle org.eclipse.core.resources.IResource.) Der ErrorParserManager stellt nützliche Methoden zum Konvertieren von Dateinamen in IResource-Objekte bereit. Wird keine mit dem Dateinamen übereinstimmende IResouce gefunden, kann standardmäßig das Projekt selbst verwendet werden.
Nachdem diese Informationen berechnet wurden, wird die Methode generateMarker() für die Erstellung des Problemmarkierungsobjekts verwendet. Die Schnittstelle org.eclipse.cdt.core.IMargerGenerator enthält Konstanten für die unterschiedlichen Bewertungsstufen. In diesem Beispiel generiert der Fehlerparser nur Markierungen mit der Fehlerkategorie Fehler. Ein in der Praxis verwendeter Fehlerparser generiert wahrscheinlich auch Markierungen für die Kategorien Warnung und Information.
Bei der tatsächlichen Entwicklung Ihres eigenen Fehlerparsers werden Sie wahrscheinlich feststellen, dass die Ausführung der IBM Rational Developer for Power Systems Software im Eclipse-Debugger sehr komfortabel ist. Der Eclipse-Debugger unterstützt das "Hot Swapping" von Klassendateien. Dies bedeutet, dass Sie den Debugger nicht erneut starten müssen, wenn Sie den Fehlerparsercode ändern und die Änderung in Kraft setzen wollen. Wenn Sie eine Änderung vornehmen und anschließend die Datei speichern, kompiliert Eclipse den Code automatisch erneut und lädt die neue Version der Klassendatei in die aktive Instanz der IBM Rational Developer for Power Systems Software.
Wenn Ihr Fehlerparser ordnungsgemäß Problemmarkierungen generiert, werden diese im Projektexplorer, in der Problemsicht und im Editor selbst angezeigt.

Wenn Sie Ihren Fehlerparser fertiggestellt haben, können Sie einen Build des Plug-ins erstellen und das Plug-in verteilen. Dieser Prozess ist sehr einfach. Klicken Sie mit der rechten Maustaste auf das Projekt und wählen Sie Exportieren aus. Im Exportassistenten wählen Sie Plug-in-Entwicklung > Implementierbare Plug-ins und Fragmente aus und klicken auf Nächste.

Auf der zweiten Seite des Assistenten wählen Sie einfach das Plug-in aus, wählen ein Exportziel aus und klicken auf Fertig stellen.

An der ausgewählten Position finden Sie jetzt einen Ordner mit dem Namen plugins. In diesem Ordner befindet sich eine jar-Datei, die das Plug-in enthält. Kopieren Sie diese Datei einfach in den Ordner plugins unter dem Ordner SDPShared in Ihrer Installation der IBM Rational Developer for Power Systems Software und starten Sie die Software wie gewohnt. Der letzte Schritt umfasst die Aktivierung des Fehlerparsers in den Projektmerkmalen.

IBM Rational Developer for Power Systems Software erkennt jetzt die Ausgabe Ihres angepassten Build-Tools.