How to split an ANTLR grammar file into multiple ones
Asked Answered
G

2

9

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.

Gott answered 7/10, 2015 at 6:34 Comment(0)
H
8

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 ;
Homebrew answered 10/2, 2016 at 19:4 Comment(1)
shouldn't it be import HelloParser;?Husted
I
4

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

Illyria answered 7/10, 2015 at 13:7 Comment(4)
yes, the version I am using is antlr4.5-opt. When I try to reference a rule in an imported grammar in the main-grammar, I get this error-message: reference to undefined rule: temp_rule (com.tunnelvisionlabs:antlr4-maven-plugin:4.5:antlr4:default:generate-sources)Gott
try to reduce your imported and main grammar files to the absolute minimum, just to demonstrate the error, and add files content in your original questionIllyria
To me seems only one import per grammar? Only way I could make it work was main.g4 imports a.g4 which imports b.g4. Not nice. But main.g4 importing a.g4 and b.g4 does indeed cause reference to undefined rules.Rajah
This might be irrelevant now, but for other viewers, to remove the error undefined rule, write options { tokenVocab = YourLexerHere; } after grammar YourGrammarName; instead of importing your Lexer Grammar.Cerement

© 2022 - 2024 — McMap. All rights reserved.