我正在尝试使用ANTLR4对此进行解析:
FSM
name type String
state type State
Relation
name type String
Mathieu
name type String
有人帮助我,纠正了我的语法,这一切都归功于他
grammar Generator;
parse
: classToGenerate+ EOF;
classToGenerate
: name=Name attributes+;
attributes
: attribute=Name 'type' type=Name;
Name : [a-zA-Z]+;
Spaces : [ \t\r\n] -> skip;
我正在以这种方式使用ANTLR4生成的解析器:
GeneratorLexer l = new GeneratorLexer(new ANTLRInputStream(GeneratorFactory.class.getResourceAsStream("/example.generator")));
GeneratorParser p = new GeneratorParser(new CommonTokenStream(l));
p.addParseListener(new GeneratorBaseListener() {
@Override public void exitClassToGenerate(GeneratorParser.ClassToGenerateContext ctx) {
System.out.println(ctx.name.getText());
}
@Override
public void exitAttributes(GeneratorParser.AttributesContext ctx) {
System.out.println(ctx.type.getText());
System.out.println(ctx.attribute.getText());
}
});
这是执行后的结果
String
name
State
state
FSM
其余的在哪里? 它没有打印关系名称字符串// Mathieu名称字符串
有什么想法吗?
编辑:好的,看来我能够打印其余文件,但我仍然有需要解决的问题。 当我这样做时:
p.classToGenerate();
它解析第一个结构,从而得到我拥有的打印件。 如果我想找到另一个结构,我需要做另一个
p.classToGenerate();
问题是,我怎么知道我必须解析多少结构? 想象一下我有5或20个相同的结构,我怎么知道呢?
谢谢!
答案 0 :(得分:0)
在语法中,您已将主规则称为parse
。规则classToGenerate
仅匹配一个类。因此,为了匹配文件中的所有类,您应该调用p.parse();
,而不是p.classToGenerate();
。