ANTLR - 解析不同的线型 - 输入错误不匹配

时间:2017-01-11 08:52:59

标签: java antlr antlr4

我正在使用ANTLR为ZOS JCL语言编写语法。 可以有4种类型的线:

  • 类型1:所有语句的前2个字符都以'//'开头 这条线
  • 类型2:评论以'// *'
  • 开头
  • 类型3:以'/ *'
  • 开头的行
  • 类型4:以类型1,2和3以外的任何其他模式开头的行

以下是我的语法文件中的片段:

dd4:    JCLBEGIN ddname  DDWORD '*' inlinerec INLINESTMTEND?;

inlinerec: (INLINEDATA)+ ;
fragment INLINEDATA: (~[\r\n])*;
.
.
.
DDWORD:     'DD';
.
.
JCLBEGIN:       '//'    ;
COMMENTBEGIN:   '//*'   ;
INLINESTMTEND:  '/*'    ;
.
.
WS     : [\r\n] -> channel(HIDDEN);

使用AntlrWorks运行此语法时,解析器规则inlinerec已正确匹配,但我收到以下错误:

line 24:0 mismatched input 'SORT' expecting INLINEDATA

我的代码中发生错误的部分是:

//SYSIN    DD  *                                      
SORT FIELDS=COPY
INCLUDE COND
/*  

如何解决此错误?

1 个答案:

答案 0 :(得分:1)

  

解析器规则inlinerec正确匹配

它可能看起来那样,但实际上,它没有正确匹配。

  

第24行:0输入'SORT'不匹配期待INLINEDATA

片段规则在解析器规则中不可见(因此INLINEDATA中无法使用inlinerec)。

只需从fragment删除INLINEDATA关键字也不会有效,因为该规则会贪婪地匹配任何一行。您需要重新考虑您的方法。我不能给出更具体的建议,因为没有什么可以继续下去。如果您有后续问题,我建议您在此处创建一个新问题,其中SSCCE表示问题。祝你好运!

另见:https://github.com/antlr/antlr4/blob/master/doc/lexer-rules.md