1

これは簡単なはずですが、解決しようとして髪を引っ張っています。

文字列内の空白 (スペースとタブ) を含む引用符で囲まれた文字列を取得し、その値を 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」

引用符の外側にあるすべてのスペースとタブを無視したいのですが、それらを引用符内にキャプチャします。

4

0 に答える 0