在ANTLR中替换令牌的文本

时间:2012-04-25 10:48:56

标签: c# antlr lexer

我正在尝试将某些令牌的文本从我的输入程序替换为特定的格式化文本。我使用C#作为输出语言。

输入示例:

time#1m2s

我输入的lex语法:

fragment
DIGIT : '0'..'9'
      ;

CTE_DURATION 
    : ('T'|'t'|'TIME'|'time') '#' '-'? (DIGIT ('d'|'h'|'m'|'s'|'ms') '_'?)+
    ;

输出令牌文本我想从输入示例中获取:

0.0:1:2.0

这意味着:0天,0小时,1分钟,2秒和0毫秒。

有什么建议吗?提前谢谢。

1 个答案:

答案 0 :(得分:2)

这是一种方法(使用Java,但不应该很难移植到C#):

grammar Test;

parse
 : CTE_DURATION EOF
 ;

CTE_DURATION 
 : ('T' 'IME'? | 't' 'ime'?) '#' minus='-'?
   (d=DIGITS 'd')? (h=DIGITS 'h')? (m=DIGITS 'm')? (s=DIGITS 's')? (ms=DIGITS 'ms')?
   {
     int days = $d == null ? 0 : Integer.valueOf($d.text);
     int hours = $h == null ? 0 : Integer.valueOf($h.text);
     int minutes = $m == null ? 0 : Integer.valueOf($m.text);
     int seconds = $s == null ? 0 : Integer.valueOf($s.text);
     int mseconds = $ms == null ? 0 : Integer.valueOf($ms.text);
     setText(($minus == null ? "" : "-") + days + "." + hours + ":" + minutes + ":" + seconds + "." + mseconds);
   }
 ;

fragment DIGITS : '0'..'9'+;

解析输入time#1m2s会产生以下解析树:

enter image description here

请注意,语法现在也接受time#(导致它产生0.0:0:0.0),但是如果输入无效,您可以轻松地从词法分析器规则中产生异常。