2

入力プログラムの一部のトークンのテキストを特定の書式設定されたテキストに置き換えようとしています。出力言語として 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 ミリ秒です。

何かアドバイス?前もって感謝します。

4

1 に答える 1

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結果を解析すると、次の解析ツリーになります。

ここに画像の説明を入力

文法time#も同様に受け入れるようになりましたが (これにより が生成され0.0:0:0.0ます)、そのような入力が無効な場合にレクサー規則から簡単に例外を生成できることに注意してください。

于 2012-04-25T11:22:51.067 に答える