murphy pope
murphy pope

Reputation: 1

Choosing lexer mode based on variable

My lexer (target language C++) contains a simple rule for parsing a string literal:

STRING: '"' ~'"'+ '"';

But based on the value returned by a function, I want my lexer to return either a STRING or an IDENT.

I've tried the following:

STRING_START:  '"'  -> mode(current_string_mode());

or

STRING_START:  '"'  -> mode(current_string_mode() == IDENT ? MODE_IDENT : MODE_STRING) ;

In either case, I get an error when trying to generate the lexer (error message says:'"' came as a complete surprise)

Upvotes: 0

Views: 45

Answers (1)

Bart Kiers
Bart Kiers

Reputation: 170178

Alas, that is not possible.

If I look at the grammar of ANTLR itself, I see this:

lexerCommands
   : RARROW lexerCommand (COMMA lexerCommand)*
   ;

lexerCommand
   : lexerCommandName LPAREN lexerCommandExpr RPAREN
   | lexerCommandName
   ;

lexerCommandName
   : identifier
   | MODE
   ;

lexerCommandExpr
   : identifier
   | INT
   ;

In short: the part between parenthesis (mode(...) or pushMode(...)) must be an identifier, or an integer literal. It cannot be an expression (what you're trying to do).

Upvotes: 1

Related Questions