function charStr(c: char): string; begin case c of #0..#31, (* nonprintable characters *) #127..#255: Result := '#' + intStr(Ord(c)); '''': Result := ''''''''''; else Result := '''' + c + ''''; end; end(*charStr*); procedure writecc(var f: Text; cc: CClass); (* print the given character class *) const MaxChar = #255; var c1, c2: char; col: integer; tag: string; Quit: boolean; begin Write(f, '[ '); col := 0; c1 := chr(0); Quit := False; while not Quit do begin if c1 in cc then begin if col > 0 then begin Write(f, ','); Inc(col); end; if col > 40 then { insert line break } begin writeln(f); Write(f, ' ': 12); col := 0; end; c2 := c1; while (c2 < MaxChar) and (succ(c2) in cc) do c2 := succ(c2); if c1 = c2 then tag := charStr(c1) else if c2 = succ(c1) then tag := charStr(c1) + ',' + charStr(c2) else tag := charStr(c1) + '..' + charStr(c2); Write(f, tag); col := col + length(tag); c1 := c2; end; Quit := c1 = MaxChar; if not Quit then c1 := Succ(c1); end; { of while } Write(f, ' ]'); end(*writecc*);引数ccで渡された集合型の文字を、印字可能なものならばそのまま出力、印字できない文字ならば数値化しています。 文字の範囲を0から255のコードを前提とした実装です。ASCIIで連続したコード値であれば、'A'...'Z'の形式で出力します。
実装でわかっていないのは、字句定義で"\t"としたときに、引数ccにはどのようなコード値で表されるかです。集合型から文字列に変えるのですが、ASCIIのコード値(#9)は、そのままUnicodeのコード値と同じで良いのか?BOMとか、非表示の文字を読み込んだらどうなるのか?さっぱりわかっていません。週末にでも、テストコードを書いて検証します。
0 件のコメント :
コメントを投稿