Ich versuche, einen Javacc-Parser zu schreiben, um GraphViz xdot format Dateien zu lesen. Dieses Dateiformat hat eine ziemlich regelmäßige Syntax, aber ich habe Schwierigkeiten herauszufinden, wie ich Token für den erweiterten Teil davon bekommen kann.Erhalten einer festen Länge Token
Das Problem ist, dass einigen der Tokens ein Längenwert vorangestellt ist, der angibt, wie lange das Token ist, und einige Parameter haben einen Längenwert, der angibt, wie die folgenden Tokens benötigt werden. Hier
ein Beispiel:
graph [_draw_="c 9 -#fffffe00 C 7 -#ffffff P 4 0 0 0 13095 1541.31 13095 1541.31 0 ",
bb="0,0,1541.3,13095",
rankdir=LR,
size="12,12",
xdotversion=1.7
];
Der erweiterte Teil, dass ich ein Problem habe mit der Zeichenfolge in Anführungszeichen nach den _draw_=
Token. Innerhalb dieser Zeichenfolge gibt die erste Zahl 9 die Länge des nächsten Tokens nach dem Startzeichen "-" an. Wenn das Token eine Reihe von Zeichen ist, die von Leerzeichen umgeben sind (einfach das Token zu definieren), aber in anderen Fällen können diese folgenden Token eingebettete Leerzeichen enthalten, so dass ich es für unmöglich halte, einen Allzweck-Regex zu definieren.
Außerdem folgt dem ersten 'P'-Zeichen innerhalb dieser Zeichenfolge eine 4, was darauf hinweist, dass 4 Zahlenpaare folgen. Wie kann der Parser diese Nummer benutzen, um die nächsten 8-Nummern-Token zu erhalten, oder sollte der Token-Manager die 8-Nummern-Zeichenfolge irgendwie zurückgeben?
Ich weiß, ich kann den gesamten Inhalt der Zeichenfolge als ein einzelner Chunk greifen und dann manuell in Java (nicht mit javacc) mit einigen String-Matching parsen. Allerdings habe ich mich gefragt, ob es eine Technik gibt, dies in javacc zu tun.
Ich vermute, dass die Länge Token nach der Lektüre ich auf einen anderen lexikalischen Zustand wechseln muß, und innerhalb dieses Spiels jedes Zeichen mit einem MORE
Modifikator und habe eine lexikalische Aktion auf einen TOKEN
Zustand zu wechseln, nachdem die erforderliche Anzahl ist getroffen. Ist das auf dem richtigen Weg? Wie zeige ich an, dass das Token in der lexikalischen Aktion abgeschlossen ist?
Muss ich mich auch um LOOKAHEAD
kümmern? (Ich denke nicht, wenn ich das alles in der Token-Manager tun)
Ich werde mit etwas Code folgen, sobald ich herausfinden, was zu tun ist.
Ich denke, Ihre Idee, MEHR zu verwenden, ist perfekt. Warum implementieren Sie es nicht und beantworten Sie Ihre eigene Frage. Um LOOKAHEAD muss man sich keine Sorgen machen. –
Um das Ende eines Tokens anzuzeigen, verwenden Sie eine TOKEN-Produktion. Wenn also ein weiteres Zeichen erwartet wird, wechseln Sie in einen Zustand, in dem ein beliebiges Zeichen ein TOKEN ist. –