My lexer(目标语言C++(包含一个解析字符串文字的简单规则:
STRING: '"' ~'"'+ '"';
但基于函数返回的值,我希望lexer返回一个STRING或IDENT。
我试过以下几种:
STRING_START: '"' -> mode(current_string_mode());
或
STRING_START: '"' -> mode(current_string_mode() == IDENT ? MODE_IDENT : MODE_STRING) ;
在任何一种情况下,我都会在尝试生成lexer时出错(错误消息显示:'"' came as a complete surprise
(
唉,这是不可能的。
如果我看看ANTLR本身的语法,我会看到:
lexerCommands
: RARROW lexerCommand (COMMA lexerCommand)*
;
lexerCommand
: lexerCommandName LPAREN lexerCommandExpr RPAREN
| lexerCommandName
;
lexerCommandName
: identifier
| MODE
;
lexerCommandExpr
: identifier
| INT
;
简而言之:括号(mode(...)
或pushMode(...)
(之间的部分必须是标识符或整数。它不能是一个表达式(你试图做的事情(。