我有以下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。但现在同样似乎并不适合我。
答案 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函数来处理可变性,这是永远不推荐的。