Wir verarbeiten IBMEnterprise japanischen COBOL-Quellcode.Japanischer COBOL-Code: Regeln für G-Literale und Bezeichner?
Die Regeln, die genau beschreiben, was in G-Typ-Literalen erlaubt ist, und was für Bezeichner erlaubt sind, sind unklar.
Das IBM Handbuch gibt an, dass ein G ‚....‘ wörtliche ein SHIFT-OUT als erstes Zeichen innerhalb der Anführungszeichen haben muss, und ein SHIFT-IN als das letzte Zeichen vor dem letzten Zitat. Unser COBOL-Lexer "weiß" dies, aber Objekte zu G-Literalen gefunden in realem Code. Fazit: Das IBM Handbuch ist falsch, oder wir lesen es falsch. Der Kunde wird uns den Code nicht sehen lassen, so dass es ziemlich schwierig ist, das Problem zu diagnostizieren.
EDIT: Überarbeitete/erweitert unten Text für Klarheit:
Kennt jemand die genauen Regeln von G wörtlichen Bildung, und wie sie (nicht) entsprechen, was die IBM-Referenzhandbücher sagen? Die ideale Antwort wäre ein regulärer Ausdruck für das G-Literal. Dies ist, was wir jetzt verwenden (von einem anderen Autor codiert, seufz):
#token non_numeric_literal_quote_g [STRING]
"<G><squote><ShiftOut> (
(<NotLineOrParagraphSeparatorNorShiftInNorShiftOut>|<squote><squote>|<ShiftOut>)
(<NotLineOrParagraphSeparator>|<squote><squote>)
| <ShiftIn> (<NotLineOrParagraphSeparatorNorApostropheNorShiftInNorShiftOut>|
<ShiftIn>|<ShiftOut>)
| <squote><squote>
)* <ShiftIn><squote>"
wo < name> ist ein Makro, das ein anderer regulärer Ausdruck ist. Vermutlich sind sie gut genug benannt, so dass Sie raten können, was sie enthalten.
Hier ist die IBM Enterprise COBOL Reference. Kapitel 3 "Zeichenketten", Zwischenüberschrift "DBCS-Literale" Seite 32 ist relevant. Ich hoffe, dass ein erfahrener IBMer uns durch die genaue Referenz sagt, wie wir ihn falsch gelesen haben: - {Ich bin besonders unklar, was der Ausdruck "DBCS-Zeichen" bedeutet, wenn "ein oder mehrere Zeichen" steht im Bereich X'00 ... X'FF für jedes Byte " Wie können DBCS-Zeichen alles andere als Paare von 8-Bit-Zeichencodes sein? Das vorhandene RE stimmt mit drei Typen von Zeichenpaaren überein, wenn Sie es untersuchen.
Eine Antwort unten schlägt vor, dass die < squote> < squote> Paarung falsch ist. OK, ich könnte das glauben, aber das bedeutet, die RE würde nur Literalstrings zurückweisen, die einzelne < Squote> s enthalten. Ich glaube nicht, dass das das Problem ist, das wir haben, wie wir scheinen, über jede Instanz eines G-Literals zu stolpern.
In ähnlicher Weise können COBOL-IDs mit mit DBCS-Zeichen zusammengesetzt werden. Was genau ist für eine Kennung erlaubt? Wieder wäre ein regulärer Ausdruck ideal.
EDIT2: Ich fange an zu denken, dass das Problem nicht der RE sein könnte. Wir lesen Shift-JIS-kodierten Text. Unser Leser konvertiert diesen Text in Unicode, wie es geht. Aber DBCS-Zeichen sind wirklich nicht Shift-JIS; Sie sind vielmehr binär codierte Daten. Wahrscheinlich ist was passiert, ist, dass DBCS-Daten übersetzt werden, als ob es Shift-JIS wäre, und das würde die Fähigkeit "zwei Bytes" als ein DBCS-Element erkennen mist.Wenn zum Beispiel ein DBCS-Zeichenpaar wäre: 81: 1F würde ein ShiftJIS-Leser dieses Paar in ein einzelnes Unicode-Zeichen umwandeln, , und seine Zwei-Byte-Natur ist dann verloren. Wenn Sie Paare nicht zählen können, können Sie das Endzitat nicht finden. Wenn Sie das Endzitat nicht finden können, können Sie das Literal nicht erkennen. So würde das Problem erscheinen zu sein, dass wir die Eingabecodierungsmodi in der Mitte des Lexing-Prozesses wechseln müssen. Yuk.
Sie meinen als Eröffnungs- oder Abschlusszitat? Das Squote-Paar in Midstring soll eine Squote in Midstring darstellen, nicht eine am Anfang oder am Ende. Ich werde die Syntax genau überprüfen, aber bist du sicher? –
Nach meinem Gedächtnis müssen Sie Midstring Zitat in G-String nicht entkommen. Für die N-Zeichenfolge müssen Sie sie verdoppeln, sodass Ihre Regel für die N-Zeichenfolge gilt. Ich habe mein Handbuch vor Jahren weggeworfen, also kann ich das nicht bestätigen. –
Ah, das Licht beginnt zu dämmern. Um Ihnen zu helfen, habe ich auf das Handbuch hingewiesen, damit Sie es wieder lesen können grin; Ich habe auch das RE neu strukturiert. Ich muss es leichter verständlich machen, habe es aber nicht geändert. Die Handbücher sind auffällig leise über die Anführungszeichen in den G-Literalen, aber sie sagen eindeutig nicht, dass sie verdoppelt werden sollten, also werde ich Ihr Recht auf diesen Teil übernehmen (Tick!). Weitere Kommentare zu meinem überarbeiteten Text? –