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は、をではなくID
2つのトークンabc
と見なし、その理由を理解しています(レクサーがトークンを発行し、を破棄して新しいトークンとして開始することを確認すると)。パーサーはの代わりに表示します。 def
abcdef
-\n
ID
abc
-\n
def
abc
def\n
abcdef\n
問題は、パーサーabc-\ndef\n
に2つではなく1つのトークンとして表示させる方法はありますか?
一方、ソースコード=の場合、abc -\ndef\n
との間のスペースのために、合法的に2つのトークンを発行する必要がabc
あり-\n
ます。