這裏有一個辦法做到這一點(這是在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