我显然是在下面的语言定义了一个错误:ANTLR语言 - 树没有创建(EOF - 语法错误)
grammar Hello;
object :
ALL* NAME ALL* '{'
(ALL* | (ALL* NAME ALL* NAME)* | (ALL* object)*)*
'}' ALL*;
ALL :
(~('{' | '}' | '"'))+ -> skip; // All but braces and double quotes
NAME :
'"' ALL* '"';
当我试图读取文件或直接添加内容(与run.bat Hello object -gui
),解析器给我一个语法错误:mismatched input '<EOF>' expecting NAME
。 而我只有一棵有单个节点的树:'object'。
这里是Java源代码:
public static void main(String[] args) throws Exception {
HelloLexer lexer = new HelloLexer(new ANTLRFileStream("gamemodes.txt"));
TokenStream tokenStream = new CommonTokenStream(lexer);
HelloParser parser = new HelloParser(tokenStream);
System.out.println(lexer.getAllTokens().size());
parser.setBuildParseTree(true);
// Tree Creation
RuleContext tree = parser.object();
tree.inspect(parser);
}
最后,文件结构(有一些空格/任何字符(不含括号和双引号)):
...
"objName"
{
...
"innerObjName1"
{
"firstProperty" "firstResult"
...
"secondProp" ""
}
"innerObjName2"
{
"firstProperty" "firstResult"
"secondProp" ""
}
}
...
备注:我在Windows上。
谢谢!
我认为你正试图用正则表达式创建的语法规则(以小写字母开头的规则,如'object'规则)。我不认为antlr可以处理这个问题。解析器规则拥有更简单的机制。 –
我在正式网站(http://www.antlr.org/wiki/display/ANTLR4/Parser+Rules#ParserRules-Subrules)中看到了一些类似于语法(*,+,?)的正则表达式的例子。 。顺便说一句,如果你有一个想法来解决我的问题,我在听你:) – Val
哇,这好像叫做EBNF,我甚至不知道它存在。很高兴知道这一点。可悲的是,虽然我无法帮助你解决你的问题。 –