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 件のコメント :
コメントを投稿