Folks
I have played quite a bit with the ANTLR documentation wrt composite grammars
and there seem to be some holes that are causing me some problems getting
grammar import going. Let describe the simple setup first. Code follows
description.
1) I have two grammars A and B. B is meant to be a proper super-set of A.
2) Seems a natural way to implement this in ANTLR would be to have the B
grammar import and extend the A grammar.
3) I have a lexer for A. The A parser has option set to use tokenVocab from
the A lexer
See below code for description of problems.
========== Code ===============
///
/// A Lexer
///
lexer grammar ALexer;
@header {
package test;
}
ID
: ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')*
;
LP
: '('
;
RP
: ')'
;
WS
: ( ' ' | '\t' | '\r' | '\n' ) {$channel=HIDDEN;}
;
///
/// A Parser
///
parser grammar AParser;
options {
language = Java;
tokenVocab = ALexer;
}
@header {
package test;
}
a
: form EOF
;
form
: LP ID RP
;
///
/// B Parser
///
parser grammar BParser;
import AParser;
@header {
package test;
}
b
: form form EOF
;
========== Problems ===============
[1] Compiling BParser produces the error message "redefinition of header
action". Without this, my generated code ends up in the wrong package.
[2] I am accustomed in writing simple ANTLR combined grammars to specifying
some of the tokens in the 'tokens' section and some in the lexer rule section.
With the above setup (sans the definitions of LP and RP in ALexer) and including
tokens {
LP = '(';
RP = ')';
}
in AParser yields the error "literal has no associated lexer rule".
[3] In BParser, the line
import AParser;
is underlined in ANTLRWork with the message "Undefined import "AParser""
========== Questions ===============
I would like the BParser to have access to an extended stock of tokens over
those supplied by ALexer. Is the right thing to do write a BLexer that imports
ALexer, have AParser use ALexer's tokenVocab and BParser import AParser and use
BLexer's tokenVocab?
That's about all for now. Any help appreciated.
List: http://www.antlr.org/mailman/listinfo/antlr-interest
Unsubscribe:
http://www.antlr.org/mailman/options/antlr-interest/your-email-address
--
You received this message because you are subscribed to the Google Groups
"il-antlr-interest" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/il-antlr-interest?hl=en.