如何知道我必须解析多少相同的结构

时间:2019-06-21 18:38:11

标签: antlr4

我正在尝试使用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个相同的结构,我怎么知道呢?

谢谢!

1 个答案:

答案 0 :(得分:0)

在语法中,您已将主规则称为parse。规则classToGenerate仅匹配一个类。因此,为了匹配文件中的所有类,您应该调用p.parse();,而不是p.classToGenerate();