ANTLR4 - 如何在引号内进行不同的标记?
ANTLR4 - How to tokenize differently inside quotes?
我正在定义一个 ANTLR4 语法,我希望它能够标记某些(但不是全部)事物,当它们出现在双引号内时与它们出现在双引号外时有所不同。这是我到目前为止的语法:
grammar SimpleGrammar;
AND: '&';
TERM: TERM_CHAR+;
PHRASE_TERM: (TERM_CHAR | '%' | '&' | ':' | '$')+;
TRUNCATION: TERM '!';
WS: WS_CHAR+ -> skip;
fragment TERM_CHAR: 'a' .. 'z' | 'A' .. 'Z';
fragment WS_CHAR: [ \t\r\n];
// Parser rules
expr:
expr AND expr
| '"' phrase '"'
| TERM
| TRUNCATION
;
phrase:
(TERM | PHRASE_TERM | TRUNCATION)+
;
上述语法在解析 a! & b
时有效,它正确解析为:
AND
/ \
/ \
a! b
但是,当我尝试解析 "a! & b"
时,我得到:
line 1:4 extraneous input '&' expecting {'"', TERM, PHRASE_TERM, TRUNCATION}
错误消息是有道理的,因为 &
被标记为 AND
。但是,我想做的是,当 &
出现在双引号内(在 "phrase" 内)时,将其标记为 PHRASE_TERM
。请注意,我确实希望 a!
标记为 TRUNCATION
,即使它出现在短语中也是如此。
这可能吗?
如果您使用词法分析器模式,这是可能的。遇到特定令牌后可以更改模式。但是词法分析器规则必须单独定义,而不是组合语法。
在你的情况下,遇到引用后,你将更改模式,遇到另一个引用后,你将模式更改回默认模式。
LBRACK : '[' -> pushMode(CharSet);
RBRACK : ']' -> popMode;
更多信息google'ANTLR lexer Mode'
我正在定义一个 ANTLR4 语法,我希望它能够标记某些(但不是全部)事物,当它们出现在双引号内时与它们出现在双引号外时有所不同。这是我到目前为止的语法:
grammar SimpleGrammar;
AND: '&';
TERM: TERM_CHAR+;
PHRASE_TERM: (TERM_CHAR | '%' | '&' | ':' | '$')+;
TRUNCATION: TERM '!';
WS: WS_CHAR+ -> skip;
fragment TERM_CHAR: 'a' .. 'z' | 'A' .. 'Z';
fragment WS_CHAR: [ \t\r\n];
// Parser rules
expr:
expr AND expr
| '"' phrase '"'
| TERM
| TRUNCATION
;
phrase:
(TERM | PHRASE_TERM | TRUNCATION)+
;
上述语法在解析 a! & b
时有效,它正确解析为:
AND
/ \
/ \
a! b
但是,当我尝试解析 "a! & b"
时,我得到:
line 1:4 extraneous input '&' expecting {'"', TERM, PHRASE_TERM, TRUNCATION}
错误消息是有道理的,因为 &
被标记为 AND
。但是,我想做的是,当 &
出现在双引号内(在 "phrase" 内)时,将其标记为 PHRASE_TERM
。请注意,我确实希望 a!
标记为 TRUNCATION
,即使它出现在短语中也是如此。
这可能吗?
如果您使用词法分析器模式,这是可能的。遇到特定令牌后可以更改模式。但是词法分析器规则必须单独定义,而不是组合语法。
在你的情况下,遇到引用后,你将更改模式,遇到另一个引用后,你将模式更改回默认模式。
LBRACK : '[' -> pushMode(CharSet);
RBRACK : ']' -> popMode;
更多信息google'ANTLR lexer Mode'