简体   繁体   中英

How to split an ANTLR grammar file into multiple ones

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.

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 ;

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM