这应该很简单,但是我试着解决它的问题。
我正在尝试获取带引号的字符串,包括字符串中的空格(空格和制表符),并将值记录在CSharp字符串中。但是,我还想忽略引用字符串之外的相同空格(通过词法分析器)。我有一个典型的WS lexer规则,但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|':'|'\''|'/'|'\\'|'_'|'@'|';'|'?'|'-'|'#'|'$'|'%'|'^'|'&'|'*')+;
示例:
输入:'Name =“我的名字”'
kvp.Value'我的名字'的预期价值
实际值'MyName'
我想忽略引号之外的所有空格和制表符,但要在引号内捕获它们。