Операторы языка управления IBM i (CL) заканчиваются символом \n
(новая строка) и используют +\n
или -\n
для продолжения длинного оператора на следующей строке (-
продолжается с позиции 1 следующей строки, +
продолжается с 1-го непустого символа в строке). следующую строку). Я использовал пример ANTLR4 RC1 "Fun with Python Newlines" в книге, который является близким совпадением, и он работает нормально, при условии, что символ продолжения +
или -
не разделяет текст токена. Например, это действительно в CL:
chg+
var +
&x (&-
x++
1) /* "Change variable" statement resulting in: chgvar &X (&X+1) */
-or-
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
как два токена abc
, def
вместо abcdef
, и я понимаю, почему (когда лексер видит -\n
, он выдает токен ID
для abc
, отбрасывает -\n
и запускает def
как новый токен.). Парсер видит abc
def\n
вместо abcdef\n
.
Вопрос в том, есть ли способ заставить синтаксический анализатор видеть abc-\ndef\n
как один токен вместо двух?
С другой стороны, если исходный код = abc -\ndef\n
, то он должен законно выдавать 2 токена из-за пробела между abc
и -\n
.