如何在ANTLR中捕获字符串中的空格?

时间:2012-06-14 21:48:15

标签: c# antlr whitespace

这应该很简单,但是我试着解决它的问题。

我正在尝试获取带引号的字符串,包括字符串中的空格(空格和制表符),并将值记录在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'

我想忽略引号之外的所有空格和制表符,但要在引号内捕获它们。

0 个答案:

没有答案