annotate parser.pas @ 0:62966dd383ed default tip

initial
author Radomir Dopieralski <sheep-devel@sheep.art.pl>
date Sun, 08 Dec 2013 19:39:15 +0100
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
1 { File i/o and parsing routines. }
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
2
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
3 UNIT Parser;
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
4
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
5 INTERFACE
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
6
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
7 USES Gzio;
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
8
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
9 CONST REMCHAR='#';
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
10 REMEND=#13;
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
11 STRCHAR='"';
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
12 VRBCHAR='\';
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
13
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
14 { TYPE CfgFile=FILE OF CHAR; }
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
15 TYPE CfgFile=gzFile;
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
16
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
17 CONST PARSE_NOERROR=0;
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
18 PARSE_ERR_EOF=1;
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
19 PARSE_ERR_NUM=2;
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
20 PARSE_ERR_STR=3;
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
21 PARSE_ERR_NAM=4;
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
22 PARSE_ERR_OPN=5;
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
23
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
24 VAR errNum:BYTE;
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
25 actLine: WORD;
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
26 FUNCTION ReadName(VAR f:CfgFile):STRING;
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
27 FUNCTION ReadString(VAR f:CfgFile):STRING;
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
28 FUNCTION ReadNumber(VAR f:CfgFile):INTEGER;
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
29 PROCEDURE OpenCfg(VAR f:CfgFile; name: STRING);
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
30 PROCEDURE CloseCfg(VAR f:CfgFile);
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
31
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
32 IMPLEMENTATION
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
33
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
34 CONST CHR_EOF=#26;
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
35
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
36 PROCEDURE OpenCfg(VAR f:CfgFile; name: STRING);
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
37 BEGIN
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
38 actLine:=1;
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
39 errNum:=PARSE_NOERROR;
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
40
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
41 f:=gzOpen(name,'r');
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
42 IF f=NIL THEN BEGIN
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
43 errNum:=PARSE_ERR_OPN;
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
44 WriteLn('Can''t open ',name);
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
45 END;
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
46 END;
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
47
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
48 PROCEDURE CloseCfg(VAR f:CfgFile);
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
49 BEGIN
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
50 IF gzClose(f)>0 THEN errNum:=PARSE_ERR_OPN;
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
51 END;
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
52
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
53 FUNCTION ReadChr(VAR f:CfgFile): CHAR;
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
54 VAR c: CHAR;
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
55 b: INTEGER;
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
56 BEGIN
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
57 b:=gzGetC(f);
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
58
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
59 IF (b<0) OR (b>255) OR (c=CHR_EOF) THEN BEGIN
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
60 errNum:=PARSE_ERR_EOF;
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
61 c:=CHR_EOF;
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
62 END ELSE c:=Chr(b);
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
63
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
64 IF c=#13 THEN Inc(actLine);
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
65 ReadChr:=c;
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
66 END;
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
67
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
68 FUNCTION IsEmpty(c:CHAR):BOOLEAN;
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
69 BEGIN
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
70 IsEmpty:=(c=' ') OR (c=#9) OR (c=#13) OR (c=#10) OR (c=CHR_EOF);
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
71 END;
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
72
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
73 FUNCTION ReadName(VAR f:CfgFile):STRING;
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
74 VAR s: STRING;
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
75 c: CHAR;
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
76 BEGIN
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
77 ReadName:='';
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
78 REPEAT
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
79 c:=ReadChr(f);
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
80 IF c=REMCHAR THEN BEGIN
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
81 REPEAT
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
82 c:=ReadChr(f);
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
83 UNTIL (c=REMEND) OR (c=CHR_EOF);
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
84 IF (c<>CHR_EOF) THEN c:=' ';
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
85 END;
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
86 UNTIL (NOT IsEmpty(c)) OR (c=CHR_EOF);
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
87 s:='';
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
88 WHILE NOT IsEmpty(c) DO BEGIN
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
89 s:=Concat(s,UpCase(c));
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
90 c:=ReadChr(f);
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
91 END;
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
92 IF s='' THEN errNum:=PARSE_ERR_NAM;
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
93 ReadName:=s;
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
94 END;
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
95
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
96 FUNCTION ReadString(VAR f:CfgFile):STRING;
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
97 VAR s: STRING;
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
98 c: CHAR;
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
99 BEGIN
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
100 ReadString:='';
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
101 REPEAT
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
102 c:=ReadChr(f);
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
103 IF c=REMCHAR THEN BEGIN
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
104 REPEAT
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
105 c:=ReadChr(f);
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
106 UNTIL (c=REMEND) OR (c=CHR_EOF);
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
107 IF (c<>CHR_EOF) THEN c:=' ';
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
108 END;
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
109 UNTIL (NOT IsEmpty(c)) OR (c=CHR_EOF);
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
110 s:='';
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
111 IF c<>STRCHAR THEN BEGIN
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
112 errNum:=PARSE_ERR_STR;
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
113 END ELSE BEGIN
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
114 REPEAT
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
115 c:=ReadChr(f);
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
116 IF c=STRCHAR THEN Break;
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
117 IF c=#13 THEN BEGIN
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
118 ErrNum:=PARSE_ERR_STR;
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
119 Exit;
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
120 END;
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
121 IF c=CHR_EOF THEN Exit;
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
122 IF c=VRBCHAR THEN BEGIN
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
123 c:=ReadChr(f);
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
124 END;
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
125 s:=Concat(s,c);
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
126 UNTIL FALSE;
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
127 END;
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
128 ReadString:=s;
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
129 END;
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
130
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
131 FUNCTION ReadNumber(VAR f:CfgFile):INTEGER;
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
132 VAR s: STRING;
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
133 c: CHAR;
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
134 i,j: INTEGER;
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
135 BEGIN
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
136 ReadNumber:=0;
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
137 REPEAT
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
138 c:=ReadChr(f);
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
139 IF c=REMCHAR THEN BEGIN
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
140 REPEAT
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
141 c:=ReadChr(f);
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
142 UNTIL (c=REMEND) OR (c=CHR_EOF);
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
143 IF (c<>CHR_EOF) THEN c:=' ';
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
144 END;
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
145 UNTIL (NOT IsEmpty(c)) OR (c=CHR_EOF);
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
146 s:='';
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
147 WHILE NOT IsEmpty(c) DO BEGIN
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
148 s:=Concat(s,UpCase(c));
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
149 c:=ReadChr(f);
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
150 END;
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
151 Val(s,i,j);
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
152 IF j=0 THEN ReadNumber:=i
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
153 ELSE BEGIN
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
154 errNum:=PARSE_ERR_NUM;
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
155 END;
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
156 END;
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
157
62966dd383ed initial
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
158 END.