3

IBM i制御言語(CL)ステートメントは\n(改行)で終了し、次の行で長いステートメントを使用+\nまたは継続します(次の行の位置1に続き、次の行の最初の非ブランク文字に続きます)。この本では、ANTLR4RC1の「FunwithPython Newlines」の例を使用しました。これは、または継続文字がトークンテキストを分割しない限り、厳密に一致し、正常に機能します。たとえば、これはCLで有効です。-\n-++-

    chg+                                                   
    var +                                                
    &x (&-                                             
    x++                                                    
       1) /* "Change variable" statement resulting in: chgvar &X (&X+1) */

-また-

    chgvar &y (&a || 'some +
    stuff') /* result: chgvar &y (&a || 'some stuff') */

単純なテストリグの文法は次のとおりです。サポートのみIDをサポートし-、ラインエスケープとして使用します。

注:lexmagic/SimplePy.g4に基づく

    grammar CL;
    pgm       :   stat+ EOF ;
    stat      :   ID NEWLINE ;
    ID        :   [a-zA-Z_] [a-zA-Z_0-9]* ;
    NEWLINE   :   '\r'? '\n' ;
    WS        :   [ \t]+ -> skip ;
    LINE_ESC  :   '-' '\r'? '\n' -> skip ;

これはそれを実行する方法です(ターミナルで必要なすべてのエクスポートとエイリアスの後):

    antlr4 CL.g4
    javac *.java
    grun CL pgm -tree
    abc- (Return once)
    def (Return, CTRL-D)
    line 2:0 extraneous input 'def' expecting NEWLINE
    (pgm (stat abc def \n) <EOF>)

ANTLR4は、をではなくID2つのトークンabcと見なし、その理由を理解しています(レクサーがトークンを発行し、を破棄して新しいトークンとして開始することを確認すると)。パーサーはの代わりに表示します。 defabcdef-\nIDabc-\ndefabc def\nabcdef\n

問題は、パーサーabc-\ndef\nに2つではなく1つのトークンとして表示させる方法はありますか?

一方、ソースコード=の場合、abc -\ndef\nとの間のスペースのために、合法的に2つのトークンを発行する必要がabcあり-\nます。

4

1 に答える 1

2

カスタム実装を使用して、レクサーから継続文字を非表示にすることに傾倒しCharStreamます。これは、次の点を除いて標準ストリームのように機能します。

  • の実装では、IntStream.LA(i)必要に応じて、正と負の両方で継続文字をスキップする必要がありますi
  • の実装では、IntStream.consume必要に応じて隠し領域をスキップする必要があります。つまり、 の通常の実装を使用した後consume、次の 2 文字が次の場合、-\nまたは+\nすぐにスキップされた文字を超えてインデックスを移動します。
  • の実装でIntStream.seekは、インデックスが可視文字に残されるようにする必要があります (詳細については、Javadoc を参照してください)。
  • の実装はCharStream.getText、結果から非表示の継続文字を削除して、指定された間隔からテキストを返す必要があります。

  • IntStream.markIntStream.releaseIntStream.indexIntStream.sizeおよびの実装には、IntStream.getSourceName特別なことは必要ありません。

lexer はすべての入力シンボルを認識するわけではないため、トークンに関連付けられた行番号と列番号が正しいことを確認するために、追加の手順を実行する必要がある場合があります。

于 2013-01-22T00:18:20.873 に答える