这里有一个办法做到这一点(这是在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
结果在下面的分析树:
请注意,该语法现在也接受time#
(导致其生成0.0:0:0.0
),但如果输入无效,则可以轻松地从词法分析规则中产生一个例外。
我不明白你的问题,你可以更具体吗?你的问题是你希望你的语法只接受这种格式的输入:0.0:1:2.0? – sm13294 2012-04-25 10:51:32
我的lex语法接受“time#1m2s”并创建一个CTE_DURATION标记,其文本是“time#1m2s”。我想要我的lex规则来更改CTE_DURATION标记文本(在我的示例中,我想将标记文本更改为“0.0:1:2.0”)。 – 2012-04-25 11:14:33