阅读 ANTLR 语法
Read a ANTLR grammar
由于语法,Antlr 生成了一个解析器。
但是,我需要发布语法本身。
例如,我需要知道有多少条规则,有多少可选的子规则,等等。
例如,
Grammar grammar = read_stream ('grammar_file.g4).
for (Rule rule : grammar.getRules())
{
//....
}
ANTLR4 是否存在这样的开箱即用的东西?
当然可以。请参阅 interpreted grammars. From a grammar file or string, you can create a Grammar
object 上的文档,其中有很多您可能感兴趣的方法,例如 getRule
.
这是一个基于该页面文档的简单示例(我还没有实际测试过!):
LexerGrammar lg = new LexerGrammar(
"lexer grammar L;\n" +
"A : 'a' ;\n" +
"B : 'b' ;\n" +
"C : 'c' ;\n");
Grammar g = new Grammar(
"parser grammar T;\n" +
"s : (A|B)* C ;\n",
lg);
for (String ruleName : g.getRuleNames()) {
Rule rule = g.getRule(null, ruleName);
// ...
}
请注意,以上内容不包括来自导入语法的规则。您也可以通过 getImportedGrammars
.
获取这些信息
由于语法,Antlr 生成了一个解析器。
但是,我需要发布语法本身。
例如,我需要知道有多少条规则,有多少可选的子规则,等等。
例如,
Grammar grammar = read_stream ('grammar_file.g4).
for (Rule rule : grammar.getRules())
{
//....
}
ANTLR4 是否存在这样的开箱即用的东西?
当然可以。请参阅 interpreted grammars. From a grammar file or string, you can create a Grammar
object 上的文档,其中有很多您可能感兴趣的方法,例如 getRule
.
这是一个基于该页面文档的简单示例(我还没有实际测试过!):
LexerGrammar lg = new LexerGrammar(
"lexer grammar L;\n" +
"A : 'a' ;\n" +
"B : 'b' ;\n" +
"C : 'c' ;\n");
Grammar g = new Grammar(
"parser grammar T;\n" +
"s : (A|B)* C ;\n",
lg);
for (String ruleName : g.getRuleNames()) {
Rule rule = g.getRule(null, ruleName);
// ...
}
请注意,以上内容不包括来自导入语法的规则。您也可以通过 getImportedGrammars
.