首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Antlr -不匹配输入错误令牌未识别

Antlr -不匹配输入错误令牌未识别
EN

Stack Overflow用户
提问于 2018-06-09 13:42:53
回答 2查看 229关注 0票数 1

我有以下的ANTLR语法。

代码语言:javascript
复制
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 ;

供投入:

代码语言:javascript
复制
//SYSIN    DD  *     
SORT FIELDS=COPY
INCLUDE COND
any other program input @ $ ! & %
/*

我得到以下错误。

DD语法::ddstmt:1:2:不匹配的输入'SYSIN DD * \r\n‘期望的名称看起来好像SYSIN不被识别为名称标记。事实上,一种类似的语法在某些时候确实起作用了。见mismatched input error。但现在看来对我来说也不一样了。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-06-09 14:20:44

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

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2018-06-13 15:20:27

JCL是痛苦的解析,因为它的上下文敏感性和意义的空白。

处理instream数据是特别棘手的-有几个选项,可以扔东西,如果你不知道他们。

例如,在DD *(或DD数据)之后可能会出现一些可选的关键字;这些关键字可能出现在与DD语句本身相同的物理行上,也可能不会出现。另一种情况是,如果在instream语句中使用可选的"/*“运算符,则分隔符可以不是"DLM=”。我需要一个非常讨厌的Java函数来处理这种可变性,而这从来没有被推荐过。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50774902

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档