Datentypen Reader/InputStream wiederverwenden?

diggaa1984

Top Contributor
Hiho,

ich habe gerade den Fall, dass ich vor meinen Lexer (Analyse von Strings für Grammatik-Parser) einen Stream schalten muss (CharacterStream aus ANTLR-api). Dieser Stream soll als Input einen String erhalten. Nach einem erfolgreichen Durchgang, sprich ich habe den Input komplett gelext, hätte ich nun gern, dass ich nich jedesmal ein neues Stream-Objekt erstelle und an den Lexer hänge, sondern stattdessen neue Daten in den Stream schreibe.

Ich habe nun die Wahl zwischen Reader und InputStream-Interfaces um mein Vorhaben zu realisieren.
Gibt es da eine Möglichkeit zur Laufzeit die Streams neu zu befüllen?! Ich habe bisher echt nix gefunden

Folgender Ablauf sollte möglich sein:

Stream füllen -> lexen (Stream kann gelernt werden, muss nich sein, kann man auch manuell machen)
Stream notfalls leeren + Lexer resetten + Stream neu befüllen -> lexen
 
Zuletzt bearbeitet:

Marco13

Top Contributor
Hm... so ganz klar ist es (mir) nicht... Das kann eine eigene Klasse sein? Dann könnte man ja einen eigenen InputStream schreiben ("RefillableInputStream" oder so :D ) - welche Rolle spielt da genau der "CharacterStream"? (Und was spricht dagegen, einen neuen Stream zu erstellen, wenn das vielleicht ohne irgendwelche Krämpfe und/oder eigene Spezialklassen möglich ist (die die Flexibilität der API einschrängen können, weil sie ja dann im schlimmsten Fall immer einen RefillableInputStream erwartet (und keinen allgemeinen InputStream))?)
 

diggaa1984

Top Contributor
also ich müsste jedesmal wenn ich etwas lexen möchte sagen:
Java:
lexer.setCharacterStream(new ...(stringToParse))

das find ich irgendwie komisch und beim Syntaxhighlighting muss ich sowas ja regelmäßig aufrufen.
Ich hatte schon die Idee ne Klasse wie du sie vorschlägst zu schreiben und mich dabei an den Initialisierungs-prozeduren der Superklasse (zb: ANTLRStringStream) zu orientieren, bzw die protected-Felder zu bearbeiten, aber da bin ich zum bsp. nicht sicher ob das Beerben der Klasse lizenztechnisch andere Umstände darstellt als das bloße Verwenden der API aus der jar-Datei. Ich wäre aber der Meinung, dass das nichts ausmacht und ich meine Software nicht zwangsweise frei verfügbar machen muss, was ich nämlich nicht entscheiden kann (Diplomarbeit).

ANTLR 3 License

[The BSD License]
Copyright (c) 2010 Terence Parr
All rights reserved.

Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
Neither the name of the author nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

vermutlich sollte ich einfach die set-Methode beibehalten ^^
Deiner Antwort entnehme ich aber, dass du auch nichts kennst, was so wie es ist, meinen Anforderungen entspricht, sondern ich mir nen Wrapper schreiben müsste, der die Funktion bereitstellt.
 
S

Spacerat

Gast
Pipe heisst das Zauberwort denk' ich. Da gibt es einen PipedReader und einen PipedWriter bzw. auch Input- und OutputStreams. Benötigt werden 2 Threads, einer für Ein- der andere für Ausgabe. Das ist nötig, da der OutputStream im Leerlauf stets auf neue Eingaben und der InputStream bei befülltem Puffer auf Entnahme der Daten wartet.
Am Ende würde dann also ein [c]lexer.write((CharSequence) sequenceToParse);[/c] genügen.
 

diggaa1984

Top Contributor
bezüglich der threads, fehlt wohl noch eine info :)

es gibt folgende Struktur (bedingt durch ANTLR-API):

Code:
CharacterStream -> Lexer -> TokenStream -> Parser (oder zB. Syntaxhighlighting-Klasse)


Der Lexer bekommt als Input ein CharacterStream (das kann StringStream sein, FileStream, InputStream etc.) .. wesentlich ist, dass der CharacterStream die Daten sofort intern ablegt und aus den internen Daten bei Bedarf die Infos rausgibt.
Der Parser pollt quasi aus dem TokenStream die Infos, welche meiner Meinung nach auch on Demand aus'm Lexer gelesen werden. Der Lexer holt die sich wiederum on Demand aus dem CharacterStream.

Daher wäre durch das manuelle Pollen erstma kein Threadhandling notwendig. ICh bräuchte auch gar nicht direkt den Lexer ansprechen sondern würde sagen
Code:
TokenStream.<machWas>
und der liefert mir das Token oder was auch immer. So der Plan.
 
Zuletzt bearbeitet:
S

Spacerat

Gast
Ok... was es damit auf sich hat, entzieht sich meiner Kenntnis. Aber du hast doch nach einem wiederbefüllbaren Stream (RandomAccessStream) gesucht. Die Pipe bietet diese Möglichkeit, erfordert aber halt 2 unabhängige Threads. Möglicherweise ist der Lexer ja bereits ein solcher Thread oder man kann ihn zu einem machen.
Eine andere Möglichkeit wäre, sich diese Pipe-Klassen mal anzusehen, zu schauen, warum 2 Threads nötig sind um sich anschliessend mit den gewonnenen Erkenntnissen selbst einen solchen RAStream zu coden, der mit nur einem Thread auskommt.
 

HoaX

Top Contributor
Lexer und Parser bei ANTLR laufen ohne Threads, d.h. für den PipedStream muss man sich selbst um die Threads kümmern.
 

diggaa1984

Top Contributor
Ich glaube das wäre mit Kanonen auf Spatzen schiessen, ich belass es erstmal beim Erzeugen neuer Instanzen, gibt ja noch genug andere Baustellen im Projekt :)

Trotzdem danke für den Ansatz mit den Pipes, werds mir mal anschauen, vielleicht kann ich das ja woanders noch gebrauchen.
 

HoaX

Top Contributor
Wenn ich so recht überlege wird das auch nicht funktionieren mit wiederverwenden. Denn der Lexer und Parser kann das Ende der Eingabe nicht zuverlässig erkennen solange der Stream nicht geschlossen wird. Dadurch würde der Syntaxcheck dann hängen bleiben wenn z.B. die abschließende Klammer in deinem Text fehlt. Denn die könnte ja noch kommen, der Stream ist ja noch nicht am Ende.
 

diggaa1984

Top Contributor
Interessante Überlegung, müsste man mal testen :)
Dann wäre die Krücke zu sagen, wenn nix im Stream soll er null liefern, mal spontan gedacht.
 

HoaX

Top Contributor
Nicht null, sondern -1 muss dein Stream liefern von dem du deinen Code liest. Und darauf musst du deinen AntlrCharacterStream los lassen. Das sollte funktionieren. Wobei ich nicht weiß wie der Lexer reagiert wenn ein Stream der zu Ende ist plötzlich wieder Daten liefert.
 

diggaa1984

Top Contributor
den lexer kann man resetten und der pollt vom stream, da dürfte es keine probleme geben ich kann auch bisher folgendes machen:

CharacterStream-Subklasse liefert eine Funktionalität von Files einzulesen (ANTLRFileStream). Diese Klasse besitzt eine Methode
Code:
load(...)
. Damit kann ich zur Laufzeit neue Daten in die interne Struktur des Streams laden. Der lexer wird resetted und alles klappt.
Damit habe ich mal eine Reihe von Testdateien auf meinen Lexer losgelassen. Intern hat der Stream dann seine Datenfelder angepasst bzw überschrieben mit den neuen Werten.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Master3000 Java Konsole über Buffered Reader Zeilenweise auslesen ? Allgemeine Java-Themen 26
Joker4632 Klassen Buffered Reader liest die Leerzeichen am Zeilen Ende nicht mehr Allgemeine Java-Themen 2
Tausendsassa Ycad dxf Reader/Writer Allgemeine Java-Themen 8
B Input/Output BufferedWriter/Reader replace line Allgemeine Java-Themen 6
nrg Spezieller gepufferter Reader Allgemeine Java-Themen 2
X Java Log Reader empfehlungen? Allgemeine Java-Themen 2
nrg new Reader(dateiname) und getResourceAsStream Allgemeine Java-Themen 17
S API File Reader Allgemeine Java-Themen 3
P PDF öffnen mit Acrobat Reader Allgemeine Java-Themen 9
M Welchen Reader? Allgemeine Java-Themen 8
X Input/Output InputStream/Scanner(System.in) read()/hasNextLine() block unterbrechen Allgemeine Java-Themen 7
krgewb Problem mit Umlauten und Eszett bei InputStream Allgemeine Java-Themen 3
W Mal ein paar generelle Fragen zu InputStream und OutputStream Allgemeine Java-Themen 4
L Input/Output InputStream öffnen? Allgemeine Java-Themen 12
P Input/Output Inputstream verhält sich verschieden Allgemeine Java-Themen 9
R Inputstream lesen mit Pointer Allgemeine Java-Themen 0
M InputStream auslesen Allgemeine Java-Themen 1
M String aus InputStream Allgemeine Java-Themen 3
C Threading mit BufferedReader/InputStream & sockets Allgemeine Java-Themen 0
B BufferedWriter in InputStream oder Zeichen-Stream in Byte-Stream Allgemeine Java-Themen 5
P Scanner als Inputstream für Java Prozess Allgemeine Java-Themen 4
E POI-InputStream selber wählen Allgemeine Java-Themen 2
S RandomAcessFile das einen InputStream wrappt..? Allgemeine Java-Themen 2
M Umwandlung ByteArrayOutputStream in InputStream Allgemeine Java-Themen 5
1 InputStream hängt Allgemeine Java-Themen 4
H Input/Output InputStream: 32-Bit-Ganzzahl (DWORD) binär lesen Allgemeine Java-Themen 5
K Inputstream -> Bilder Allgemeine Java-Themen 23
1 InputStream liest die letzte Zeile nicht ein Allgemeine Java-Themen 2
J Java Datei aus FTP in ein INputstream Allgemeine Java-Themen 2
J InputStream Zip-File Allgemeine Java-Themen 3
F ImageIO cant create InputStream Allgemeine Java-Themen 9
S InputStream "weiterleiten" Allgemeine Java-Themen 12
T Integer aus InputStream lesen Allgemeine Java-Themen 3
T Undwandlung eines String in einen InputStream? Allgemeine Java-Themen 3
M Selbst geschriebener InputStreamReader über einen beliebigen InputStream Allgemeine Java-Themen 4
T OutputStream to InputStream Allgemeine Java-Themen 8
S von OutputStream in InputStream schreiben ohne das es blockiert..? Allgemeine Java-Themen 2
reibi BufferedImage nach InputStream Allgemeine Java-Themen 10
R InputStream zweimal lesen Allgemeine Java-Themen 2
G InputStream und File Allgemeine Java-Themen 11
B InputStream zu URL umwandeln Allgemeine Java-Themen 2
F Teile vom InputStream schreiben Allgemeine Java-Themen 9
J InputStream aus URL funktioniert nicht Allgemeine Java-Themen 7
H InputStream Problem mit externem Kommandozeilenprogramm Allgemeine Java-Themen 2
W InputStream öfters nutzen Allgemeine Java-Themen 9
R The mark method of InputStream does nothing. Allgemeine Java-Themen 4
V String oder doch InputStream? Allgemeine Java-Themen 9
A Inputstream in Outputstream umleiten Allgemeine Java-Themen 7
Nils_Langner InputStream soll sich bei neuen Daten melden Allgemeine Java-Themen 2
R InputStream - seltsamer Output Allgemeine Java-Themen 2
S java.io.InputStream.read(byte[] b) überschreiben Allgemeine Java-Themen 33
N InputStream erst ab gegebener Position Allgemeine Java-Themen 4
R InputStream Allgemeine Java-Themen 5
G InputStream kopieren? Allgemeine Java-Themen 6
D Inputstream aus StringBuffer Allgemeine Java-Themen 3
G inputstream() to imageicon() Allgemeine Java-Themen 7
D Durch OutpustStream und InputStream dateien in eine jar sch Allgemeine Java-Themen 3
G aus String einen InputStream erstellen Allgemeine Java-Themen 2
C Wie kann man im InputStream nach einer Zeichenkette suchen? Allgemeine Java-Themen 4
R Aus InputStream wieder eine Datei erzeugen? Allgemeine Java-Themen 2
N String als Inputstream Allgemeine Java-Themen 4
N Suchen in InputStream/ByteArrayOutputStream Allgemeine Java-Themen 11
M InputStream.read abbrechen Allgemeine Java-Themen 2

Ähnliche Java Themen


Oben