【发布时间】:2013-04-02 19:53:01
【问题描述】:
我在以下语言定义中显然有一个错误:
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无法处理。解析器规则拥有更简单的机制。 -
我在official website 中看到了一些使用正则表达式的示例,例如语法 (*, +, ?)...顺便说一句,如果你有解决我问题的想法,我在听你的:)
-
哇,这好像叫EBNF,我什至不知道它存在。很高兴知道这一点。不过很遗憾,我无法帮助您解决问题。
标签: java tree antlr token grammar