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

//样本文件
NameCount = 4
名称= a
名称= b
名称= c
名称= d
//文件结尾

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

如何在语法中定义Name应该精确地重复nc次?

最佳答案

这不能用语法本身来表达。如果数字是固定的,则可以表示预期令牌的数量。但是令牌流根据值而变化。您可以做的是将其包括到词法分析器/解析器组合中。但是您不能仅通过简单的语法来创建此构造。您可能想要一些类似的东西

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++;
      }
...

07-25 23:46