Antlr - 不匹配的输入错误 - 无法识别令牌
Antlr - mismatched input error - token not recognised
我有以下 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 令牌。实际上,类似的语法确实在某个时候起作用。参见 。但是现在同样的方法似乎对我不起作用。
我的猜测是您没有重新生成 parser/lexer 类,因为以下代码工作正常:
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();
JCL 很难解析,因为它的上下文敏感性和空格的重要性。
处理流内数据特别棘手 - 那里有一些可选选项,如果您不知道它们,可能会把它们扔掉。
例如DD *(或DD DATA)后面可能出现一些可选关键字;这些可能会也可能不会出现在与 DD 语句本身相同的物理行上。另一个是如果在 instream DD 语句中使用可选的 "DLM=" 运算符,则分隔符可以不是“/*”。我需要一个非常讨厌的 Java 函数来处理可变性,这是不推荐的。
我有以下 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 令牌。实际上,类似的语法确实在某个时候起作用。参见
我的猜测是您没有重新生成 parser/lexer 类,因为以下代码工作正常:
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();
JCL 很难解析,因为它的上下文敏感性和空格的重要性。
处理流内数据特别棘手 - 那里有一些可选选项,如果您不知道它们,可能会把它们扔掉。
例如DD *(或DD DATA)后面可能出现一些可选关键字;这些可能会也可能不会出现在与 DD 语句本身相同的物理行上。另一个是如果在 instream DD 语句中使用可选的 "DLM=" 运算符,则分隔符可以不是“/*”。我需要一个非常讨厌的 Java 函数来处理可变性,这是不推荐的。