aboutsummaryrefslogtreecommitdiffstats
path: root/doc/user/pascal
blob: 41376dfa9a326c31849a5e379e6c4a2c8fec0cbe (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
@Chapter
    @Title { Pascal and Modula-2 Programs }
@Begin
@LP
There is a @Code "@Pas" symbol for printing Pascal programs
pascal @Index { Pascal programs }
pas. @Index @Code "@Pas"
@Cite { $jensen1975pascal }.  No attempt is made to follow any
particular printing standard; the design simply reflects this author's
taste.  To use {@Code "@Pas"}, place @Code "@SysInclude { pas }" at the
start of your document in the usual way.  A Pascal program or program
fragment is entered like this:
@ID @Code {
"@ID @Pas {"
"procedure PriDelete(x: PriEntry; var Q: PriorityQueue);"
"    var i: integer;"
"begin"
"    with Q^ do begin"
"        size := size - 1;"
"        if x^.back <= size then"
"        begin"
"            i := x^.back;"
"            A[i] := A[size + 1];"
"            A[i]^.back := i;"
"            PriAddRoot(i, Q);"
"            PriAddLeaf(i, Q)"
"        end"
"    end"
"end;"
"}"
}
This produces
@ID @Pas {
procedure PriDelete(x: PriEntry; var Q: PriorityQueue);
    var i: integer;
begin
    with Q^ do begin
	size := size - 1;
	if x^.back <= size then
	begin
	    i := x^.back;
	    A[i] := A[size + 1];
	    A[i]^.back := i;
	    PriAddRoot(i, Q);
	    PriAddLeaf(i, Q)
	end
    end
end;
}
Blank lines, line breaks, indents and spaces in the input are respected,
with a tab being considered equal to eight spaces.  @Code "@Pas" can also
be used within a paragraph to produce a fragment like
@OneCol @Pas { A[i..j] }.  Use @Code "@OneCol @Pas { ... }" to prevent the
result from breaking over two lines.
@PP
@Code "@Pas" does not attempt to rearrange the program in any way.  Each
item is simply printed according to the following plan:
@ID {
7c @Wide {
      @Code and 	|2.5ct @Pas { and }
//1vx @Code array 	|2.5ct @Pas { array }
//1vx @Code begin 	|2.5ct @Pas { begin }
//1vx @Code case 	|2.5ct @Pas { case }
//1vx @Code const 	|2.5ct @Pas { const }
//1vx @Code div 	|2.5ct @Pas { div }
//1vx @Code do 		|2.5ct @Pas { do }
//1vx @Code downto 	|2.5ct @Pas { downto }
//1vx @Code else 	|2.5ct @Pas { else }
//1vx @Code end 	|2.5ct @Pas { end }
//1vx @Code file 	|2.5ct @Pas { file }
//1vx @Code for 	|2.5ct @Pas { for }
//1vx @Code forward	|2.5ct @Pas { forward }
//1vx @Code function 	|2.5ct @Pas { function }
//1vx @Code goto 	|2.5ct @Pas { goto }
//1vx @Code if 		|2.5ct @Pas { if }
//1vx @Code in 		|2.5ct @Pas { in }
//1vx @Code label 	|2.5ct @Pas { label }
//1vx @Code mod 	|2.5ct @Pas { mod }
//1vx @Code nil 	|2.5ct @Pas { nil }
//1vx @Code not 	|2.5ct @Pas { not }
//1vx @Code of 		|2.5ct @Pas { of }
//1vx @Code or 		|2.5ct @Pas { or }
//1vx @Code otherwise 	|2.5ct @Pas { otherwise }
//1vx @Code packed 	|2.5ct @Pas { packed }
//1vx @Code procedure 	|2.5ct @Pas { procedure }
//1vx @Code program 	|2.5ct @Pas { program }
//1vx @Code record 	|2.5ct @Pas { record }
//1vx @Code repeat 	|2.5ct @Pas { repeat }
//1vx @Code set 	|2.5ct @Pas { set }
//1vx @Code then 	|2.5ct @Pas { then }
//1vx @Code to 		|2.5ct @Pas { to }
//1vx @Code type 	|2.5ct @Pas { type }
//1vx @Code until 	|2.5ct @Pas { until }
//1vx @Code var 	|2.5ct @Pas { var }
//1vx @Code while 	|2.5ct @Pas { while }
//1vx @Code with 	|2.5ct @Pas { with }
} | 7c @Wide {
      @Code "0"		|2.5ct @Pas { 0 }
//1vx @Code "1"		|2.5ct @Pas { 1 }
//1vx @Code "2"		|2.5ct @Pas { 2 }
//1vx @Code "3"		|2.5ct @Pas { 3 }
//1vx @Code "4"		|2.5ct @Pas { 4 }
//1vx @Code "5"		|2.5ct @Pas { 5 }
//1vx @Code "6"		|2.5ct @Pas { 6 }
//1vx @Code "7"		|2.5ct @Pas { 7 }
//1vx @Code "8"		|2.5ct @Pas { 8 }
//1vx @Code "9"		|2.5ct @Pas { 9 }
//1vx @Code "."		|2.5ct @Pas { . }
//1vx @Code ","		|2.5ct @Pas { , }
//1vx @Code ":"		|2.5ct @Pas { : }
//1vx @Code ";"		|2.5ct @Pas { ; }
//1vx @Code "'"		|2.5ct @Pas { ' }
//1vx @Code "`"		|2.5ct @Pas { ` }
//1vx @Code "+"		|2.5ct @Pas { + }
//1vx @Code "-"		|2.5ct @Pas { - }
//1vx @Code "*"		|2.5ct @Pas { * }
//1vx @Code "/"		|2.5ct @Pas { / }
//1vx @Code "("		|2.5ct @Pas { ( }
//1vx @Code ")"		|2.5ct @Pas { ) }
//1vx @Code "["		|2.5ct @Pas { [ }
//1vx @Code "]"		|2.5ct @Pas { ] }
//1vx @Code "^"		|2.5ct @Pas { ^ }
//1vx @Code ".."	|2.5ct @Pas { .. }
//1vx @Code "="		|2.5ct @Pas { = }
//1vx @Code "<"		|2.5ct @Pas { < }
//1vx @Code ">"		|2.5ct @Pas { > }
//1vx @Code "<>"	|2.5ct @Pas { <> }
//1vx @Code "<="	|2.5ct @Pas { <= }
//1vx @Code ">="	|2.5ct @Pas { >= }
//1vx @Code ":="	|2.5ct @Pas { := }
}
}
Anything not mentioned here will appear in italic font.
@PP
Unlike the @Code "@CP" symbol from the previous chapter, the @Code "@Pas"
symbol is a quick-and-dirty production which does not offer you any options,
or indeed attempt to solve every problem of Pascal formatting.  In
particular, Pascal strings need attention before formatting by
{@Code "@Pas"}.  Their interiors are best enclosed in double quotes to
prevent the above transformations from occurring inside them.  Any
@Code "\\" or @Code "\"" characters inside strings will need to be
replaced by @Code "\\\\" and @Code "\\\"" respectively, and the opening
quote should be replaced by {@Code "`"}.
@PP
Similar remarks apply to Pascal comments; don't forget that @Code "{"
and @Code "}" must be enclosed in double quotes.  Alternatively, a
@Code "@Com" symbol can be placed in front of a comment enclosed
in braces.  It will add literal braces:
@ID @Code {
"@Com { A Pascal comment }"
}
has result
@ID @Pas {
@Com { A Pascal comment }
}
It may still be necessary to enclose the interior in double quotes.
@PP
There is a @Code "@Modula" symbol which allows you to format Modula-2
programs in the same way as @Code "@Pas" does for Pascal.  You get it
via {@Code "@SysInclude { modula }"}, and once again it is a quick-and-dirty
production.
@End @Chapter