Antlr - несоответствующая ошибка ввода - токен не распознан - PullRequest
0 голосов
/ 09 июня 2018

У меня есть следующая грамматика ANTLR.

grammar DDGrammar;

ddstmt: dd2 EOF;

dd2: splddstart inlinerec;
splddstart: '//' NAME DDWORD '*' NL;
inlinerec: NON_JCL_CARD* END_OF_FILE ;

DDWORD:'DD';
//DUMMYWORD: 'DUMMY';

NAME: [A-Z@#$]+;

NON_JCL_CARD  : ~'/'  {getCharPositionInLine() == 1}? .*? ( NL | EOF ) ;
END_OF_FILE   : '/'  {getCharPositionInLine() == 1}? '*' ;

NL  : '\r' '\n' ;
WS  : [ \t]+ -> skip ;

Для ввода:

//SYSIN    DD  *     
SORT FIELDS=COPY
INCLUDE COND
any other program input @ $ ! & %
/*

Я получаю следующую ошибку.

DDGrammar :: ddstmt: 1: 2: несоответствующий ввод 'SYSIN DD * \ r \ n', ожидающий NAME Похоже, SYSIN не распознается как токен NAME.На самом деле похожая грамматика сработала некоторое время назад.См. несоответствующая ошибка ввода .Но сейчас то же самое не похоже на работу для меня.

Ответы [ 2 ]

0 голосов
/ 13 июня 2018

JCL трудно анализировать из-за его чувствительности к контексту и важности пробелов.

Обработка данных instream особенно трудна - есть несколько дополнительных функций, которые могут выбрасывать вещи, если вы не знаетеих.

Например, есть некоторые дополнительные ключевые слова, которые могут появляться после DD * (или DD DATA);они могут появляться или не отображаться в той же физической строке, что и сам оператор DD.Другое заключается в том, что разделитель может отличаться от «/ *», если в операторе instream DD используется необязательный оператор «DLM =».Мне нужна была довольно неприятная Java-функция для обработки изменчивости, которая никогда не рекомендуется.

0 голосов
/ 09 июня 2018

Я предполагаю, что вы не регенерировали классы синтаксического анализатора / лексера, поскольку следующий код работает просто отлично:

String source = "//SYSIN    DD  *     \r\n" +
        "SORT FIELDS=COPY\r\n" +
        "INCLUDE COND\r\n" +
        "any other program input @ $ ! & %\r\n" +
        "/*";

DDGrammarLexer lexer = new DDGrammarLexer(CharStreams.fromString(source));
DDGrammarParser parser = new DDGrammarParser(new CommonTokenStream(lexer));

parser.ddstmt();
...