Antlr - 输入错误不匹配 - 无法识别令牌

时间:2018-06-09 13:42:54

标签: java parsing antlr4

我有以下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令牌。实际上类似的语法确实在某个时候起作用了。见mismatched input error。但现在同样似乎并不适合我。

2 个答案:

答案 0 :(得分:1)

我的猜测是你没有重新生成解析器/词法分析器类,因为下面的代码运行得很好:

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();

答案 1 :(得分:0)

由于JCL的上下文敏感性和whitspace的重要性,JCL很难解析。

处理插播数据尤其棘手 - 如果你不了解它们,那里有一些可以抛出的选项。

例如,在DD *(或DD DATA)之后可能会出现一些可选的关键字;这些可能会或可能不会出现在与DD语句本身相同的物理行上。另一个是分隔符可以不是" / *"如果可选" DLM ="运算符用于instream DD语句。我需要一个非常讨厌的Java函数来处理可变性,这是永远不推荐的。