ANTLR 获得第一批产品
ANTLR get first production
我正在使用 ANTLR4,特别是在他们的仓库 (grammar) 中可用的 C 语法。似乎语法没有初始规则,所以我想知道如何获得它。事实上,一旦初始化了解析器,我就附加了我的监听器,但是我得到了语法错误,因为我试图用不同的代码指令解析两个文件:
int a;
int foo() { return 0; }
在我的示例中,我使用 "parser.primaryExpression();"
调用解析器,这是 "g4" 文件的第一个产品。是否可以避免调用第一个产品并由 ANTLR 自动获取它?
ANTLR 没有提供API获取第一条规则。但是,在生成的解析器中,字段
public static final String[] ruleNames = ....;
按照语法中出现的顺序列出规则名称。有了反射,就可以访问方法了。
当心。 Antlr 'spec' 中没有任何内容定义此顺序。迄今为止一直如此。
除了@GRosenberg 的回答:
此外,规则枚举(在生成的解析器中)包含每个规则的条目,按照它们在语法中出现的顺序排列,第一条规则的值为 0。但是,仅仅因为它是语法中的第一条规则并不这并不意味着它是主要入口点。只有语法作者知道真正的条目是什么,有时您甚至可能只想使用子规则进行解析,这使得这个决定变得更加困难。
我正在使用 ANTLR4,特别是在他们的仓库 (grammar) 中可用的 C 语法。似乎语法没有初始规则,所以我想知道如何获得它。事实上,一旦初始化了解析器,我就附加了我的监听器,但是我得到了语法错误,因为我试图用不同的代码指令解析两个文件:
int a;
int foo() { return 0; }
在我的示例中,我使用 "parser.primaryExpression();"
调用解析器,这是 "g4" 文件的第一个产品。是否可以避免调用第一个产品并由 ANTLR 自动获取它?
ANTLR 没有提供API获取第一条规则。但是,在生成的解析器中,字段
public static final String[] ruleNames = ....;
按照语法中出现的顺序列出规则名称。有了反射,就可以访问方法了。
当心。 Antlr 'spec' 中没有任何内容定义此顺序。迄今为止一直如此。
除了@GRosenberg 的回答:
此外,规则枚举(在生成的解析器中)包含每个规则的条目,按照它们在语法中出现的顺序排列,第一条规则的值为 0。但是,仅仅因为它是语法中的第一条规则并不这并不意味着它是主要入口点。只有语法作者知道真正的条目是什么,有时您甚至可能只想使用子规则进行解析,这使得这个决定变得更加困难。