2010-11-30 5 views
2

Ich bin sehr neu in der ANTLR-Welt und ich versuche herauszufinden, wie kann ich dieses Parsing-Tool verwenden, um eine Reihe von "verrauschten" String zu interpretieren. Was ich gerne erreichen möchte, ist folgendes.

lassen Sie uns zum Beispiel nehmen diesen Satz: It's 10PM and the Lazy CAT is currently SLEEPING heavily on the SOFA in front of the TVANTLR auf einem verrauschten Datenstrom

Was ich CAT extrahieren möchte, ist, SLEEPING und SOFA und haben eine Grammatik, die leicht die folgenden Muster entsprechen: SUBJECT - VERB - Dativobjekt ... wo ich

VERB : 'SLEEPING' | 'WALKING';
SUBJECT : 'CAT'|'DOG'|'BIRD';
INDIRECT_OBJECT : 'CAR'| 'SOFA';

etc definieren könnte .. ich will nicht endet mit einem permanenten „NoVi cableException ", da ich nicht alle Möglichkeiten der Sprachstruktur beschreiben kann. Ich möchte nur nutzlose Wörter auseinanderreißen und nur diejenige behalten, die interessant ist.

Es ist mehr wie wenn ich einen tokeniser hatte und fragte den Parser „Ok, den Stream lesen, bis Sie einen Betreff finden, dann den Rest ignorieren, bis Sie ein VERB finden, etc ..“

Ich brauche ein extrahieren organisierte Struktur in einer nicht organisierten Satz ... zum Beispiel würde ich mag der Lage sein, zu interpretieren (ich bin die Stichhaltigkeit dieser äußerst einfach und falsche Ansicht von ‚Englisch Grammatik‘ nicht zu urteilen)
SUBJECT - VERB - INDIRECT OBJECT
INDIRECT OBJECT - SUBJECT - VERB

so werde ich Sätze wie

It's 10PM and the Lazy CAT is currently SLEEPING heavily on the SOFA in front of the TV analysieren

oder

It's 10PM and, on the SOFA in front of the TV, the Lazy CAT is currently SLEEPING heavily

Antwort

3

Sie konnten nur ein paar Lexer Regeln erstellen (die, die Sie geschrieben, zum Beispiel), und als letztes Mittel Lexer Regel, können Sie ein beliebiges Zeichen und skip() es passen:

VERB   : 'SLEEPING' | 'WALKING'; 
SUBJECT   : 'CAT'|'DOG'|'BIRD'; 
INDIRECT_OBJECT : 'CAR'| 'SOFA'; 
ANY    : . {skip();}; 

Die Reihenfolge ist hier wichtig: Der Lexer versucht, Token von oben nach unten zu vergleichen. Wenn er also keinem der Tokens VERB, SUBJECT oder INDIRECT_OBJECT entspricht, fällt er auf die ANY Regel und überspringt dieses Token. Anschließend können Sie diese Parser Regeln verwenden, um Ihren Eingabestrom zu filtern:

parse 
    : sentenceParts+ EOF 
    ; 

sentenceParts 
    : SUBJECT VERB INDIRECT_OBJECT 
    ; 

, die die Eingabe von Text analysieren werden:

Es ist 10.00 Uhr und die faule Katze derzeit SCHLAFEN stark auf dem Sofa vor dem Fernseher. Der DOG ist auf dem SOFA WALKING.

wie folgt:

alt text

+1

Das ist genau das, was ich erreichen wollte! Dies ist viel intuitiver als JavaCC im Umgang mit dieser Art von Filter – BlackLabrador

+0

@BlackLabrador, Gern geschehen. –