如何在ANTLR中指定令牌的确切出现次数?

时间:2008-11-21 13:47:49

标签: java parsing antlr grammar antlrworks

我必须定义一个文件的语法,如下所示。

//示例文件
NameCount = 4
名称= a 名称= b
名称= c
名称= d
//文件结束

现在,我可以为 NameCount 名称定义令牌。但我必须定义文件结构,包括令牌名称的有效实例数,这是 NameCount 之后的值。我将值解析并转换为整数并存储在语法的全局范围内的变量中(例如在变量 nc 中)。

如何在语法中定义名称应该重复 nc 次?

2 个答案:

答案 0 :(得分:6)

这不能用语法本身来表达。如果数字已修复,您可以表达预期令牌的数量。但令牌流会根据值更改。你可以做的是将它包含在词法分析器/解析器组合中。但是你不能只通过普通的语法语法来创建这个构造。你可能想要一些

的内容
grammar test;

@members {
  private int count = 0;
  private int names = 0;
}

file
    : count (name)+
      {
        if (count != names) throw new Exception("");
      }
    ;

count
    : 'NameCount' EQ Number
      {
        count = Integer.parseInt($Number.text);
      }
    ;

name
    : 'Name' EQ Value
      {
        names++;
      }
...

答案 1 :(得分:1)

我不确定这是一个无上下文语法。如果不是,你不能告诉ANTLR解析语言。