我使用以下Java代码来实例化使用ANTLR生成的解析器。
package foo;
public class Test1 {
public static void main(String[] args) throws RecognitionException {
CharStream stream = new ANTLRStringStream("foo ");
BugLexer lexer = new BugLexer(stream);
CommonTokenStream tokenStream = new CommonTokenStream(lexer);
BugParser parser = new BugParser(tokenStream);
parser.specification();
}
}
我的语法:
grammar Bug;
options {
language = Java;
}
@header {
package foo;
}
@lexer::header {
package foo;
}
specification :
'foo' EOF
;
WS
: (' ' | '\t' | '\n' | '\r')+ {$channel = HIDDEN;}
;
SCOLON
: (~ ';')+
;
我得到的错误:
第1:0行不匹配的输入'foo'期待'foo'
我希望输入中的空格被忽略,但它不是.. eclipse中的antlr解释器说它很好所以我想我的Java代码不知何故,但我只是看不到它...
注意:如果我删除了SCOLON的规则,那么输入就不会出错。
答案 0 :(得分:2)
ANTLR的词法分析器尝试尽可能多地匹配每个令牌。因此,"foo "
被标记为单个SCOLON
令牌而不是为'foo'
- 和WS
令牌。
请注意您的SCOLON
规则:
SCOLON
: (~ ';')+
;
通过其名称建议仅匹配一个分号,但实际上匹配除了分号之外的一个或多个字符。也许应该是这样的:
SCOLON
: ';'
;
Heinrich Ody写道:
我不知何故认为有一个优先级(由声明顺序给出),令牌ANTLR尝试匹配输入。谢谢你的回复。
这是正确的:只要两个(或更多)规则匹配相同数量的字符,首先定义的规则将“赢”。但如果最后定义的规则与大多数字符匹配,则“赢”。