antlr lexer规则几乎可以匹配任何东西

时间:2014-03-26 16:54:15

标签: parsing antlr antlr3

我在这里遇到了一个问题,我确定这是关于antlr是如何工作的,我做错了但我读了很多文档和教程,但我仍然不完全理解它。

当我添加(因为我需要)一个可能与其不应该匹配的事物的词法分析规则时,我的症状是你的语法停止工作。它应该只在适当的背景下应用。

我需要ATTR规则,因为我需要description以及其他规则,以便从该关键字获取字符串到行尾。

这是相互冲突的规则:

ATTR  
    :   (~('\r'| '\n'))*
    ;

它似乎匹配任何内容,因此它“吃掉”应该匹配不同令牌的文本。这是有道理的,但我需要它,或者我需要另一种解决方案。

这是我当前的示例输入

; This is a comment
; Comment 2

audit-template this is the id {
    description a description may include any char but {line break}
}

作为参考,这是我目前的完整语法:

grammar Grammar;

options { 
  superClass = AbstractTParser;
}

@header {
package antlrTest;

}

@lexer::header {
package antlrTest;
}

@lexer::members {
    private void debug(String str) {
        System.err.println("DEBUG(L) " + str);
    }
}

@members {
    private void debug(String str) {
        System.err.println("DEBUG(P) " + str);
    }
}

parse
  :  (template|'**TODO**') EOF { debug ("EOF"); }
  ;

template : 'audit-template' id=IDENTIFIER OB content=templateContent CB { debug("template id=" + $id.text); }
  ;


templateContent:
    description?
;

description : 'description' ATTR
;

//

COMMENT
  :  ';' ~( '\r' | '\n' )* {$channel=HIDDEN; debug("COMMENT");}
  ;

SPACES : ( '\t' | '\f' | ' ' | '\n'| '\r' ) {$channel=HIDDEN;}
  ;

OB :    '{' { debug("OB"); }
    ;

CB :    '}' ('\r'| '\n')+ { debug("CB(lf)"); }
        | '}' EOF { debug("CB(eof)"); }
    ;

IDENTIFIER  
    :   ( 'a'..'z' | 'A'..'Z' | '_' )
        ( 'a'..'z' | 'A'..'Z' | '_' | '0'..'9' | '.' | ' ' | '\t')*
    ;

ATTR  
    :   (~('\r'| '\n'))*
    ;

我收到此错误(错误处理有点调整):

Line 4 char 0
    at antlrTest.AbstractTParser.reportError(AbstractTParser.java:45)
    at antlrTest.GrammarParser.parse(GrammarParser.java:106)
    at antlrTest.TemplateParser.parseInput(TemplateParser.java:15)
    at antlrTest.Main.testFile(Main.java:32)
    at antlrTest.Main.main(Main.java:11)
Caused by: NoViableAltException(7@[])
    at antlrTest.GrammarParser.parse(GrammarParser.java:71)
    ... 3 more

解决方案?备择方案?谢谢。

0 个答案:

没有答案