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ます。