4 Stimmen

Erkennung von erweiterten Zeichen mit JAVACC

Ich erstelle gerade eine Grammatik mit JavaCC und bin auf ein kleines Problem gestoßen. Ich versuche zu ermöglichen, dass jedes gültige Zeichen innerhalb des erweiterten ASCII-Satzes vom resultierenden Compiler erkannt wird. Nachdem ich mir die gleichen JavaCC-Beispiele angesehen habe (vor allem das Beispiel, das den JavaCC-Grammer selbst zeigt), habe ich das folgende Token eingerichtet, um meine Zeichen zu erkennen:

< CHARACTER:

  (   (~["'"," ","\\","\n","\r"])
    | ("\\"
        ( ["n","t","b","r","f","\\","'","\""]
        | ["0"-"7"] ( ["0"-"7"] )?
        | ["0"-"3"] ["0"-"7"] ["0"-"7"]
        )
      )
  )

>

Wenn ich das richtig verstehe, sollte es auf die oktale Darstellung aller ASCII-Zeichen von 0-377 (die alle 256 Zeichen im erweiterten ASCII-Satz abdeckt) abgestimmt sein. Dies funktioniert wie erwartet für alle Tastaturzeichen (a-z, 0-9, ?,./ usw.) und sogar für die meisten Sonderzeichen (© , ¬ ®). Wenn ich jedoch versuche, das Markensymbol (™) zu analysieren, löst mein Parser ständig eine End of File-Ausnahme aus, die anzeigt, dass er das Symbol nicht erkennen kann. Gibt es eine offensichtliche Möglichkeit, meine Definition eines Zeichens zu verbessern, damit das Markensymbol akzeptiert wird?

2voto

fernacolo Punkte 6452

Ich hatte ein ähnliches Problem bei der Erkennung von Sonderzeichen in einer Textdatei (entweder CP1252 oder ISO-8859-1 kodiert), die vor dem Parsen in einen String eingelesen wurde. Meine Lösung war das Hinzufügen der UNICODE_INPUT in die Kopfzeile der Grammatik:

options {
  UNICODE_INPUT=true;
}

Funktionierte wie ein Kinderspiel.

Weitere Informationen zu den JavaCC-Optionen: http://javacc.java.net/doc/javaccgrm.html

1voto

RGordon1982 Punkte 51

Es stellte sich heraus, dass meine Grammatik alle gültigen Unicode-Zeichen und nicht ASCII-Zeichen akzeptieren sollte, da das ™-Symbol Teil der Unicode-Spezifikation und nicht in einem erweiterten ASCII-Zeichensatz enthalten ist. Die Änderung meines Tokens für ein gültiges Zeichen wie unten beschrieben löste mein Problem: (Ein gültiges Unicode-Zeichen hat das Format - U+00FF)

< CHARACTER:(   (~["'"," ","\\","\n","\r"])
| ("\\"
    ( ["n","t","b","r","f","\\","'","\""]
    | ["u","U"]["+"]["0"-"9","a"-"f","A"-"F"]["0"-"9","a"-"f","A"-"F"]["0"-"9","a"-"f","A"-"F"]["0"-"9","a"-"f","A"-"F"]
    )
  ) )>

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X