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



>我有以下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::d dstmt:1:2:不匹配的输入"SYSIN DD * \r"期望名称 看起来 SYSIN 未被识别为 NAME 令牌。实际上,类似的语法确实在某个时候起作用了。请参阅不匹配的输入错误。但现在似乎同样不适合我。

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

String source = "//SYSIN    DD  *     rn" +
"SORT FIELDS=COPYrn" +
"INCLUDE CONDrn" +
"any other program input @ $ ! & %rn" +
"/*";
DDGrammarLexer lexer = new DDGrammarLexer(CharStreams.fromString(source));
DDGrammarParser parser = new DDGrammarParser(new CommonTokenStream(lexer));
parser.ddstmt();

JCL解析起来很痛苦,因为它的上下文敏感性和whitspace的重要性。

处理内流数据特别棘手 - 如果您不知道它们,其中有一些选项可能会丢弃内容。

例如,有一些可选关键字可能出现在 DD *(或 DD DATA(之后;这些关键字可能与 DD 语句本身出现在同一物理行上,也可能不出现在同一物理行上。 另一种方法是,如果在内流 DD 语句中使用了可选的"DLM="运算符,则分隔符可以不是"/*"。 我需要一个非常讨厌的Java函数来处理可变性,这是从不推荐的。

最新更新