ANTLR auf einem verrauschten Datenstrom
-
29-09-2019 - |
Frage
Ich bin sehr neu in der ANTLR Welt und ich versuche, herauszufinden, wie kann ich dieses Parsing-Tool verwenden, um eine Reihe von „lauten“ Zeichenfolge zu interpretieren. Was würde Ich mag ist folgendes zu erreichen.
nehmen wir zum Beispiel diesen Satz: It's 10PM and the Lazy CAT is currently SLEEPING heavily on the SOFA in front of the TV
Was ich Extrakt möchte ist CAT
, SLEEPING
und SOFA
und haben eine Grammatik, dass Spiel leicht das folgende Muster: SUBJECT - VERB - Dativobjekt ... wo ich definieren könnte
VERB : 'SLEEPING' | 'WALKING';
SUBJECT : 'CAT'|'DOG'|'BIRD';
INDIRECT_OBJECT : 'CAR'| 'SOFA';
etc .. Ich mag nicht, um über die Runden mit einer permanenten „NoViableException“, wie ich alle Möglichkeiten, um die Struktur der Sprache nicht beschreiben kann. Ich will nur auseinander unnütze Worte reißen und halten nur die eine, die interessant sind.
Es ist eher 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 eine organisierte Struktur in einer nicht organisierten Satz ... Zum Beispiel zu extrahieren, würde Ich mag der Lage sein, zu interpretieren (Ich bin nicht die Stichhaltigkeit dieser äußerst einfach und falsche Ansicht von ‚Englisch Grammatik‘ zu urteilen)
SUBJECT - VERB - INDIRECT OBJECT
INDIRECT OBJECT - SUBJECT - VERB
so werde ich Sätze analysieren wie
It's 10PM and the Lazy CAT is currently SLEEPING heavily on the SOFA in front of the TV
oder
It's 10PM and, on the SOFA in front of the TV, the Lazy CAT is currently SLEEPING heavily
Lösung
Sie können nur ein paar Lexer Regeln erstellen (die, die Sie geschrieben, zum Beispiel), und als letztes Mittel Lexer Regel, können Sie jedes Zeichen und skip()
es:
VERB : 'SLEEPING' | 'WALKING';
SUBJECT : 'CAT'|'DOG'|'BIRD';
INDIRECT_OBJECT : 'CAR'| 'SOFA';
ANY : . {skip();};
Die Reihenfolge ist hier wichtig: die Lexer versuchen Token von oben nach unten anzupassen, so dass, wenn es nicht dem Token VERB
, SUBJECT
oder INDIRECT_OBJECT
mithalten kann, ist es „fällt durch“ auf die ANY
Regel und überspringt diese 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 ist derzeit SCHLAFEN stark auf dem Sofa vor dem Fernseher. Die DOG ist zu Fuß auf dem Sofa.
wie folgt: