Reputation: 609
I have a large grammar file, and plan to split it into multiple ones, so that I can reuse some of those smaller files in another grammar file. I have tried doing it but failed. Can you please tell if such a feature is available, and if so, please direct me towards an example.
Upvotes: 9
Views: 6302
Reputation: 171
If you want to split lexer and parser.
Lexer:
lexer grammar HelloLexer;
Hello : 'hello' ;
ID : [a-z]+ ; // match lower-case identifiers
WS : [ \t\r\n]+ -> skip ; // skip spaces, tabs, newlines
Parser:
parser grammar HelloParser;
options { tokenVocab=HelloLexer; }
r : Hello ID ;
Remember to name the files HelloLexer.g4 and HelloParser.g4
if you want to import a whole grammar, then you should use the import keyword
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 ;
Upvotes: 8
Reputation: 164
You did not mention ANTLR version, so I am going to assume you are using the current one - 4.x.
In ANTLR4 grammars can be imported with import
keyword.
Something like this:
File: CommonLexerRules.g4
lexer grammar CommonLexerRules;
ID : [a-zA-Z]+ ;
...
File: MyParser.g4
grammar MyParser;
import CommonLexerRules; //includes all rules from lexer CommonLexerRules.g4
...
Rules in the “main grammar” override rules from imported grammars to implement inheritance. See more details here: https://theantlrguy.atlassian.net/wiki/display/ANTLR4/Grammar+Structure#GrammarStructure-GrammarImports
Upvotes: 4