这应该很简单,但我正在努力解决它。
我正在尝试获取带引号的字符串,包括字符串中的空格(空格和制表符),并将值记录在 CSharp 字符串中。但是,我也想忽略引用字符串之外包含的相同空格(通过词法分析器)。我包含了典型的 WS 词法分析器规则,但是 WS 规则会在我需要时取出空格(当它在带引号的字符串中时)。如果我从 WS 规则中删除 {channel=HIDDEN},我会丢失所有其他空格,并且必须在令牌之间的任何地方手动添加 WS。任何帮助将不胜感激!这是我的语法:
program returns [KeyValuePair<string, string> kvp]
:
ident=IDENT {kvp.Key = ident.Text;}
'='
quote=quoted_ident {kvp.Value = quote.ret;}
;
quoted_ident returns [string ret]
:
'"'
(
(ident=IDENT|ident=DOUBLE) {$ret += ident.Text;}
|
ws=WS {$ret += ws.Text;}
)+
'"'
;
WS :
(
' '
|
'\t'
)
{ $channel = HIDDEN; }
;
fragment DIGIT: '0'..'9';
fragment LETTER: ('a'..'z' | 'A'..'Z');
fragment DOT:'.';
DOUBLE : ((DIGIT)+(DOT(DIGIT)+)?)|(DOT(DIGIT)+);
IDENT : (LETTER|DIGIT|DOT|':'|'\''|'/'|'\\'|'_'|'@'|';'|'?'|'-'|'#'|'$'|'%'|'^'|'&'|'*')+;
例子:
输入:'名称=“我的名字”'
kvp.Value '我的名字'的期望值
实际值“我的名字”
我想忽略引号外的所有空格和制表符,但在引号内捕获它们。