これは簡単なはずですが、解決しようとして髪を引っ張っています。
文字列内の空白 (スペースとタブ) を含む引用符で囲まれた文字列を取得し、その値を 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|':'|'\''|'/'|'\\'|'_'|'@'|';'|'?'|'-'|'#'|'$'|'%'|'^'|'&'|'*')+;
例:
入力: '名前 = "私の名前" '
kvp.Value ' My Name ' の期待値
実際の値「MyName」
引用符の外側にあるすべてのスペースとタブを無視したいのですが、それらを引用符内にキャプチャします。