我在这里遇到了一个问题,我确定这是关于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
解决方案?备择方案?谢谢。