2010-01-05 5 views
5

Ich möchte C-Code generieren. Ich werde nicht aus einer Eingabedatei Zeile für Zeile lesen (wie es beispielsweise ein Compiler könnte). Eher werde ich Benutzereingaben analysieren, wie sie ankommen, Zeile für Zeile.Suche sehr einfache ANTLR Fehlerbehandlung Beispiel bei der Generierung von C-Code

Ich würde es vorziehen, schlechte Eingabe im Lexer/Parser, zB

/* lexer tokens */ 
foo : "FOO"; 
bar : "BAR"; 
baz : "BAZ"; 
/* grammar*/ 
grammar : foo "=" BAZ 
     | foo "=" BAR 
     | <some non-existent Antrl-else> : {printf(stderr, "bad input\n");} 
     ; 

OK zu erkennen und zu behandeln, wenn ich es nicht in der Lexer/Parser fangen kann, so scheint es, wie ich displayRecognitionError() verwenden muß aber wie??

Kann mir jemand auf ein sehr einfaches Beispiel hinweisen, das C-Code generiert und einige Fehler bei ungültigen Eingaben zeigt?

Danke!


Ok, Kopfgeld, Yippee!

Aber nur für eine echte, funktionierende Antwort, mit echtem, funktionierendem Code. Nein "benutze Methode X()" ohne ein Beispiel.

+1

FYI: dieses Kopfgeld wird auf die Antwort mit den meisten Stimmen nach Ablauf der Tage gehen, unabhängig davon, ob Sie eine Antwort akzeptieren oder nicht. –

+1

Vielleicht hilft dieser Thread: http://markmail.org/message/pumvrybnhvfme5h6#query:rulecatch%20antlr%20c+page:1+mid:3jjjdzbecknrq644+state:results (beachten Sie die verschiedenen Antworten zu dieser Frage!) –

+1

Ich sehe, Sie verwenden printf in Ihrem Beispiel. Verwenden Sie die Sprache C oder C++? – chollida

Antwort

5

eine Erkennungs Ausnahme in Java Handhabung würde so gehen:

grammar X; 

// ... 

@rulecatch{ 
    catch(RecognitionException rex) { 
    // do something 
    } 
} 

// parser rules 

// lexer rules 

Mit anderen Worten, fügen Sie einfach einige benutzerdefinierte C-Code innerhalb des @rulecatch{ ... } Block.

+0

Bart, ich vermute, das ist die beste Antwort, die ich bekommen werde. Ich werde es für ein paar Tage offen lassen, für den Fall, dass jemand einen brillianten C-Demo-Code gibt, und Ihnen dann die Antwort geben, wenn nicht. danke für deine hilfe – Mawg

+1

Kein problem mawg. Wenn ich etwas Zeit finde, werde ich vielleicht sogar ein kleines C-Demo machen, aber mein C ist rostig, um es gelinde auszudrücken! –

+1

Ich habe schnell auf die C-Laufzeit geschaut: 'configure'-ing und' make'-ing die Laufzeit für C und das Generieren eines Lexer & Parsers ging in Ordnung, aber schreiben eine kleine Anwendung mit einer Hauptmethode, die diese Lexer & Parser verwendet Dateien nicht, und ich hatte keine Lust mehr Zeit damit zu verbringen, tut mir leid. Ich hoffe, dass jemand anders Ihnen dabei helfen kann. Aber hast du versucht, was ich empfohlen habe? Wenn Sie versucht haben, aber gescheitert sind, könnte es hilfreich sein zu erwähnen, was genau falsch gelaufen ist. Viel Glück. –

7

Was Sie am wahrscheinlichsten suchen, ist die displayRecognitionError() Funktion. Diese Funktion wird in den Fällen aufgerufen, an denen Sie interessiert sind, und ist Teil der C-Laufzeit.

Wenn Sie ein Beispiel für die Verwendung dieser Funktion sehen möchten, sehen Sie sich this mailing list post an. Obwohl dieser Code C und C++ vermischt, sollten Sie in der Lage sein, herauszufinden, was Sie davon brauchen.

+0

Vielen Dank, ich werde es überprüfen. Entschuldigung, dass ich bereits eine Antwort angenommen habe; Ich habe kein anderes erwartet. – Mawg

+1

Keine Sorge - hoffe, dass es dir hilft –