2015-10-07 87 views
1

我有一个很大的语法文件,并计划将其拆分为多个文件,以便我可以在另一个语法文件中重用这些较小的文件。我尝试过,但失败了。你能否告诉我们这个功能是否可用,如果有的话,请直接给我一个例子。如何将ANTLR语法文件拆分为多个文件

回答

1

你没有提到ANTLR版本,所以我打算假设你正在使用当前版本 - 4.x. 在ANTLR4语法中,可以使用import关键字导入语法。 事情是这样的:

文件:CommonLexerRules.g4

lexer grammar CommonLexerRules; 

ID : [a-zA-Z]+ ; 
... 

文件:MyParser.g4

grammar MyParser;  
import CommonLexerRules; //includes all rules from lexer CommonLexerRules.g4 
... 

规则从进口文法“主语法”覆盖规则来实现继承。 在此处查看更多详细信息:https://theantlrguy.atlassian.net/wiki/display/ANTLR4/Grammar+Structure#GrammarStructure-GrammarImports

+0

是的,我使用的版本是antlr4.5-opt。当我尝试在主语法中引用导入语法中的规则时,我收到以下错误消息:对未定义规则的引用:temp_rule(com.tunnelvisionlabs:antlr4-maven-plugin:4.5:antlr4:default:generate-sources ) –

+0

尽量减少导入的和主要的语法文件到绝对最小值,只是为了演示错误,并在原始问题中添加文件内容 – user3890638

0

如果要分割词法分析器和分析器。

词法:

lexer grammar HelloLexer; 
Hello : 'hello' ; 
ID : [a-z]+ ;    // match lower-case identifiers 
WS : [ \t\r\n]+ -> skip ; // skip spaces, tabs, newlines 

分析器:

parser grammar HelloParser; 
options { tokenVocab=HelloLexer; } 
r : Hello ID ;  

记住命名文件HelloLexer.g4和HelloParser.g4

如果要导入整个语法,那么你应该使用导入关键字

grammar Hello; 

import OtherGrammar; 

Hello : 'hello' ; 
ID : [a-z]+ ;    // match lower-case identifiers 
WS : [ \t\r\n]+ -> skip ; // skip spaces, tabs, newlines  
r : Hello ID ; 
+1

不应该是'import HelloParser;'? – Boriel