|
|
1.1 ! root 1: .\" Copyright (c) 1980 Regents of the University of California. ! 2: .\" All rights reserved. The Berkeley software License Agreement ! 3: .\" specifies the terms and conditions for redistribution. ! 4: .\" ! 5: .\" @(#)puman5.n 6.2 (Berkeley) 5/7/86 ! 6: .\" ! 7: .if !\n(xx \{\ ! 8: .so tmac.p \} ! 9: .ND ! 10: .nr H1 4 ! 11: .NH ! 12: Details on the components of the system ! 13: .NH 2 ! 14: Options ! 15: .PP ! 16: The programs ! 17: .PI , ! 18: .PC , ! 19: and ! 20: .XP ! 21: take a number of options.\*(dg ! 22: .FS ! 23: \*(dgAs ! 24: .IX ! 25: uses ! 26: .PI ! 27: to translate Pascal programs, ! 28: it takes the options of ! 29: .PI ! 30: also. ! 31: We refer to them here, however, as ! 32: .PI ! 33: options. ! 34: .FE ! 35: There is a standard ! 36: .UX ! 37: convention for passing options to programs on the command line, ! 38: and this convention is followed by the ! 39: .UP ! 40: system programs. ! 41: As we saw in the examples above, ! 42: option related arguments consisted of the character `\-' followed ! 43: by a single character option name. ! 44: .PP ! 45: Except for the ! 46: .B b ! 47: option ! 48: which takes a single digit value, ! 49: each option may be set on (enabled) ! 50: or off (disabled.) ! 51: When an on/off valued option appears on the command line of ! 52: .PI ! 53: or ! 54: .PX ! 55: it inverts the default setting of that option. ! 56: Thus ! 57: .LS ! 58: % \*bpi -l foo.p\fR ! 59: .LE ! 60: enables the listing option ! 61: .B l , ! 62: since it defaults off, while ! 63: .LS ! 64: % \*bpi -t foo.p\fR ! 65: .LE ! 66: disables the run time tests option ! 67: .B t , ! 68: since it defaults on. ! 69: .PP ! 70: In additon to inverting the default settings of ! 71: .PI ! 72: options on the command line, it is also possible to control the ! 73: .PI ! 74: options ! 75: within the body of the program by using comments of a special ! 76: form illustrated by ! 77: .LS ! 78: {$l-} ! 79: .LE ! 80: .PP ! 81: Here we see that the opening comment delimiter (which could also be a `(*') ! 82: is immediately followed by the character `$'. ! 83: After this `$', which signals the start of the option list, ! 84: we can place a sequence of letters and option controls, separated by `,' ! 85: characters\*(dd. ! 86: .FS ! 87: \*(ddThis format was chosen because it is used by Pascal 6000-3.4. ! 88: In general the options common to both implementations are controlled ! 89: in the same way so that comment control in options is mostly ! 90: portable. ! 91: It is recommended, however, that only one control be put per comment for ! 92: maximum portability, as the Pascal 6000-3.4 ! 93: implementation will ignore controls ! 94: after the first one which it does not recognize. ! 95: .FE ! 96: The most basic actions for options are to set them, thus ! 97: .LS ! 98: {$l+ Enable listing} ! 99: .LE ! 100: or to clear them ! 101: .LS ! 102: {$t-,p- No run-time tests, no post mortem analysis} ! 103: .LE ! 104: Notice that `+' always enables an option and `\-' always disables it, ! 105: no matter what the default is. ! 106: Thus `\-' has a different meaning in an option comment than it has on the ! 107: command line. ! 108: As shown in the examples, ! 109: normal comment text may follow the option list. ! 110: .NH 2 ! 111: Options common to Pi, Pc, and Pix ! 112: .PP ! 113: The following options are common to both the compiler ! 114: and the interpreter. ! 115: With each option we give its default setting, ! 116: the setting it would have if it appeared on the command line, ! 117: and a sample command using the option. ! 118: Most options are on/off valued, ! 119: with the ! 120: .B b ! 121: option ! 122: taking a single digit value. ! 123: .SH ! 124: Buffering of the file output \- b ! 125: .PP ! 126: The ! 127: .B b ! 128: option controls the buffering of the file ! 129: .I output . ! 130: The default is line buffering, with flushing at ! 131: each reference to the file ! 132: .I input ! 133: and under certain other circumstances detailed in section 5 ! 134: below. ! 135: Mentioning ! 136: .B b ! 137: on the command line, e.g. ! 138: .LS ! 139: % \*bpi -b assembler.p\fR ! 140: .LE ! 141: causes standard output to be block buffered, ! 142: where a block is some system\-defined number of characters. ! 143: The ! 144: .B b ! 145: option may also be controlled in comments. ! 146: It, unique among the ! 147: .UP ! 148: options, ! 149: takes a single digit value rather than an on or off setting. ! 150: A value of 0, e.g. ! 151: .LS ! 152: {$b0} ! 153: .LE ! 154: causes the file ! 155: .I output ! 156: to be unbuffered. ! 157: Any value 2 or greater causes block buffering and is equivalent ! 158: to the flag on the command line. ! 159: The option control comment setting ! 160: .B b ! 161: must precede the ! 162: .B program ! 163: statement. ! 164: .SH ! 165: Include file listing \- i ! 166: .PP ! 167: The ! 168: .B i ! 169: option takes the name of an ! 170: .B include ! 171: file, ! 172: .B procedure ! 173: or ! 174: .B function ! 175: name and causes it ! 176: to be listed while translating\*(dg. ! 177: .FS ! 178: \*(dg\*bInclude\fR files are discussed in section 5.9. ! 179: .FE ! 180: Typical uses would be ! 181: .LS ! 182: % \*bpix -i scanner.i compiler.p\fR ! 183: .LE ! 184: to make a listing of the routines in the file scanner.i, and ! 185: .LS ! 186: % \*bpix -i scanner compiler.p\fR ! 187: .LE ! 188: to make a listing of only the routine ! 189: .I scanner . ! 190: This option is especially useful for conservation-minded programmers making ! 191: partial program listings. ! 192: .SH ! 193: Make a listing \- l ! 194: .PP ! 195: The ! 196: .B l ! 197: option enables a listing of the program. ! 198: The ! 199: .B l ! 200: option defaults off. ! 201: When specified on the command line, it causes ! 202: a header line identifying the version of the translator in use ! 203: and a line giving the modification time of the file being translated ! 204: to appear before the actual program listing. ! 205: The ! 206: .B l ! 207: option is pushed and popped by the ! 208: .B i ! 209: option at appropriate points in the program. ! 210: .SH ! 211: Standard Pascal only \- s ! 212: .PP ! 213: The ! 214: .B s ! 215: option causes many of the features of the ! 216: .SM UNIX ! 217: implementation which are not found in standard Pascal ! 218: to be diagnosed as `s' warning errors. ! 219: This option defaults off and is enabled when mentioned on the command line. ! 220: Some of the features which are diagnosed are: ! 221: non-standard ! 222: .B procedure s ! 223: and ! 224: .B function s, ! 225: extensions to the ! 226: .B procedure ! 227: .I write , ! 228: and the padding of constant strings with blanks. ! 229: In addition, all letters are mapped to lower case except in ! 230: strings and characters so that the case of keywords and identifiers ! 231: is effectively ignored. ! 232: The ! 233: .B s ! 234: option is most useful when a program is to be transported, thus ! 235: .LS ! 236: % \*bpi -s isitstd.p\fR ! 237: .LE ! 238: will produce warnings unless the program meets the standard. ! 239: .SH ! 240: Runtime tests \- t and C ! 241: .PP ! 242: These ! 243: options control the generation of tests that subrange variable ! 244: values are within bounds at run time. ! 245: .PI ! 246: defaults to generating tests and uses the option ! 247: .B t ! 248: to disable them. ! 249: .PC ! 250: defaults to not generating tests, ! 251: and uses the option ! 252: .B C ! 253: to enable them. ! 254: Disabling runtime tests also causes ! 255: .B assert ! 256: statements to be treated as comments.\*(dd ! 257: .FS ! 258: \*(ddSee section A.1 for a description of ! 259: .B assert ! 260: statements. ! 261: .FE ! 262: .SH ! 263: Suppress warning diagnostics \- w ! 264: .PP ! 265: The ! 266: .B w ! 267: option, which defaults on, ! 268: allows the translator to print a number of warnings about inconsistencies ! 269: it finds in the input program. ! 270: Turning this option off with a comment of the form ! 271: .LS ! 272: {$w-} ! 273: .LE ! 274: or on the command line ! 275: .LS ! 276: % \*bpi -w tryme.p\fR ! 277: .LE ! 278: suppresses these usually useful diagnostics. ! 279: .SH ! 280: Generate counters for a pxp execution profile \- z ! 281: .PP ! 282: The ! 283: .B z ! 284: option, which defaults off, ! 285: enables the production of execution profiles. ! 286: By specifying ! 287: .B z ! 288: on the command line, i.e. ! 289: .LS ! 290: % \*bpi -z foo.p\fR ! 291: .LE ! 292: or by enabling it in a comment before the ! 293: .B program ! 294: statement causes ! 295: .PI ! 296: and ! 297: .PC ! 298: to insert operations in the interpreter code to ! 299: count the number of times each statement was executed. ! 300: An example of using ! 301: .XP ! 302: was given in section 2.6; ! 303: its options are described in section 5.6. ! 304: Note that the ! 305: .B z ! 306: option cannot be used on separately compiled programs. ! 307: .NH 2 ! 308: Options available in Pi ! 309: .SH ! 310: Post-mortem dump \- p ! 311: .PP ! 312: The ! 313: .B p ! 314: option defaults on, ! 315: and causes the runtime system to initiate a post-mortem ! 316: backtrace when an error occurs. ! 317: It also cause ! 318: .X ! 319: to count statements in the executing program, ! 320: enforcing a statement limit to prevent infinite loops. ! 321: Specifying ! 322: .B p ! 323: on the command line disables these checks and the ability ! 324: to give this post-mortem analysis. ! 325: It does make smaller and faster programs, however. ! 326: It is also possible to control the ! 327: .B p ! 328: option in comments. ! 329: To prevent the post-mortem backtrace on error, ! 330: .B p ! 331: must be off at the end of the ! 332: .B program ! 333: statement. ! 334: Thus, the Pascal cross-reference program was translated with ! 335: .LS ! 336: % \*bpi -pbt pxref.p\fR ! 337: .LE ! 338: .NH 2 ! 339: Options available in Px ! 340: .PP ! 341: The first argument to ! 342: .X ! 343: is the name of the file containing the program to be interpreted. ! 344: If no arguments are given, then the file ! 345: .I obj ! 346: is executed. ! 347: If more arguments are given, they are available to the Pascal ! 348: program by using the built-ins ! 349: .I argc ! 350: and ! 351: .I argv ! 352: as described in section 4.6. ! 353: .ne 7 ! 354: .PP ! 355: .I Px ! 356: may also be invoked automatically. ! 357: In this case, whenever a Pascal object file name is given as a command, ! 358: the command will be executed with ! 359: .X ! 360: prepended to it; that is ! 361: .LS ! 362: % \*bobj primes\fR ! 363: .LE ! 364: will be converted to read ! 365: .LS ! 366: % \*bpx obj primes\fR ! 367: .LE ! 368: .NH 2 ! 369: Options available in Pc ! 370: .SH ! 371: Generate assembly language \- S ! 372: .PP ! 373: The program is compiled and the assembly language ! 374: output is left in file appended .s. ! 375: Thus ! 376: .LS ! 377: % \*bpc -S foo.p\fR ! 378: .LE ! 379: creates a file ! 380: .I foo.s . ! 381: No executable file is created. ! 382: .SH ! 383: Symbolic Debugger Information \- g ! 384: .PP ! 385: The ! 386: .B g ! 387: option causes the compiler to generate information ! 388: needed by ! 389: .I sdb (1) ! 390: the symbolic debugger. ! 391: For a complete description of ! 392: .I sdb ! 393: see Volume 2c of the ! 394: .UX ! 395: Reference Manual. ! 396: .SH ! 397: Redirect the output file \- o ! 398: .PP ! 399: The ! 400: .I name ! 401: argument after the ! 402: .B -o ! 403: is used as the name of the output file instead of ! 404: .I a.out . ! 405: Its typical use is to name the compiled program using ! 406: the root of the file name. ! 407: Thus: ! 408: .LS ! 409: % \*bpc -o myprog myprog.p\fR ! 410: .LE ! 411: causes the compiled program to be called ! 412: .I myprog . ! 413: .SH ! 414: Generate counters for a \*iprof\fP execution profile \- p ! 415: .PP ! 416: The compiler produces code which counts the number of times each ! 417: routine is called. ! 418: The profiling is based on a periodic sample taken by the ! 419: system rather than by inline counters used by ! 420: .XP . ! 421: This results in less degradation in execution, ! 422: at somewhat of a loss in accuracy. ! 423: See ! 424: .I prof (1) ! 425: for a more complete description. ! 426: .SH ! 427: Run the object code optimizer \- O ! 428: .PP ! 429: The output of the compiler is run through ! 430: the object code optimizer. ! 431: This provides an increase in compile time in ! 432: exchange for a decrease in compiled code size ! 433: and execution time. ! 434: .NH 2 ! 435: Options available in Pxp ! 436: .PP ! 437: .I Pxp ! 438: takes, on its command line, a list of options followed by the program file ! 439: name, which must end in `.p' as it must for ! 440: .PI , ! 441: .PC , ! 442: and ! 443: .IX . ! 444: .I Pxp ! 445: will produce an execution profile if any of the ! 446: .B z , ! 447: .B t ! 448: or ! 449: .B c ! 450: options is specified on the command line. ! 451: If none of these options is specified, then ! 452: .XP ! 453: functions as a program reformatter. ! 454: .PP ! 455: It is important to note that only the ! 456: .B z ! 457: and ! 458: .B w ! 459: options of ! 460: .XP , ! 461: which are common to ! 462: .PI , ! 463: .PC , ! 464: and ! 465: .XP ! 466: can be controlled in comments. ! 467: All other options must be specified on the command line to have any effect. ! 468: .PP ! 469: The following options are relevant to profiling with ! 470: .XP : ! 471: .SH ! 472: Include the bodies of all routines in the profile \- a ! 473: .PP ! 474: .I Pxp ! 475: normally suppresses printing the bodies of routines ! 476: which were never executed, to make the profile more compact. ! 477: This option forces all routine bodies to be printed. ! 478: .SH ! 479: Suppress declaration parts from a profile \- d ! 480: .PP ! 481: Normally a profile includes declaration parts. ! 482: Specifying ! 483: .B d ! 484: on the command line suppresses declaration parts. ! 485: .SH ! 486: Eliminate include directives \- e ! 487: .PP ! 488: Normally, ! 489: .XP ! 490: preserves ! 491: .B include ! 492: directives to the output when reformatting a program, ! 493: as though they were comments. ! 494: Specifying ! 495: .B \-e ! 496: causes the contents of the specified files to be reformatted ! 497: into the output stream instead. ! 498: This is an easy way to eliminate ! 499: .B include ! 500: directives, e.g. before transporting a program. ! 501: .SH ! 502: Fully parenthesize expressions \- f ! 503: .PP ! 504: Normally ! 505: .XP ! 506: prints expressions with the minimal parenthesization necessary to ! 507: preserve the structure of the input. ! 508: This option causes ! 509: .I pxp ! 510: to fully parenthesize expressions. ! 511: Thus the statement which prints as ! 512: .LS ! 513: d := a + b mod c / e ! 514: .LE ! 515: with minimal parenthesization, the default, will print as ! 516: .LS ! 517: d := a + ((b mod c) / e) ! 518: .LE ! 519: with the ! 520: .B f ! 521: option specified on the command line. ! 522: .SH ! 523: Left justify all procedures and functions \- j ! 524: .PP ! 525: Normally, each ! 526: .B procedure ! 527: and ! 528: .B function ! 529: body is indented to reflect its static nesting depth. ! 530: This option prevents this nesting and can be used if the indented ! 531: output would be too wide. ! 532: .SH ! 533: Print a table summarizing procedure and function calls \- t ! 534: .PP ! 535: The ! 536: .B t ! 537: option causes ! 538: .XP ! 539: to print a table summarizing the number of calls to each ! 540: .B procedure ! 541: and ! 542: .B function ! 543: in the program. ! 544: It may be specified in combination with the ! 545: .B z ! 546: option, or separately. ! 547: .SH ! 548: Enable and control the profile \- z ! 549: .PP ! 550: The ! 551: .B z ! 552: profile option is very similar to the ! 553: .B i ! 554: listing control option of ! 555: .PI . ! 556: If ! 557: .B z ! 558: is specified on the command line, then all arguments up to the ! 559: source file argument which ends in `.p' are taken to be the names of ! 560: .B procedure s ! 561: and ! 562: .B function s ! 563: or ! 564: .B include ! 565: files which are to be profiled. ! 566: If this list is null, then the whole file is to be profiled. ! 567: A typical command for extracting a profile of part of a large program ! 568: would be ! 569: .LS ! 570: % \*bpxp -z test parser.i compiler.p\fR ! 571: .LE ! 572: This specifies that profiles of the routines in the file ! 573: .I parser.i ! 574: and the routine ! 575: .I test ! 576: are to be made. ! 577: .NH 2 ! 578: Formatting programs using pxp ! 579: .PP ! 580: The program ! 581: .XP ! 582: can be used to reformat programs, by using a command of the form ! 583: .LS ! 584: % \*bpxp dirty.p > clean.p\fR ! 585: .LE ! 586: Note that since the shell creates the output file `clean.p' before ! 587: .XP ! 588: executes, so `clean.p' and `dirty.p' must not be the same file. ! 589: .PP ! 590: .I Pxp ! 591: automatically paragraphs the program, performing housekeeping ! 592: chores such as comment alignment, and ! 593: treating blank lines, lines containing exactly one blank ! 594: and lines containing only a form-feed character as though they ! 595: were comments, preserving their vertical spacing effect in the output. ! 596: .I Pxp ! 597: distinguishes between four kinds of comments: ! 598: .HP ! 599: .RS ! 600: .IP 1) ! 601: Left marginal comments, which begin in the first column of the ! 602: input line and are placed in the first column of an output line. ! 603: .IP 2) ! 604: Aligned comments, which are preceded by no input tokens on the ! 605: input line. ! 606: These are aligned in the output with the running program text. ! 607: .IP 3) ! 608: Trailing comments, which are preceded in the input line by a token with ! 609: no more than two spaces separating the token from the comment. ! 610: .IP 4) ! 611: Right marginal comments, which are preceded in the input line ! 612: by a token from which they are separated by at least three spaces or a tab. ! 613: These are aligned down the right margin of the output, ! 614: currently to the first tab stop after the 40th column from the current ! 615: ``left margin''. ! 616: .RE ! 617: .LP ! 618: Consider the following program. ! 619: .LS ! 620: % \*bcat comments.p\fR ! 621: .so comments1.p ! 622: .LE ! 623: When formatted by ! 624: .XP ! 625: the following output is produced. ! 626: .LS ! 627: % \*bpxp comments.p\fR ! 628: .so commentsout ! 629: % ! 630: .LE ! 631: The following formatting related options are currently available in ! 632: .XP . ! 633: The options ! 634: .B f ! 635: and ! 636: .B j ! 637: described in the previous section may also be of interest. ! 638: .SH ! 639: Strip comments \-s ! 640: .PP ! 641: The ! 642: .B s ! 643: option causes ! 644: .XP ! 645: to remove all comments from the input text. ! 646: .SH ! 647: Underline keywords \- \_ ! 648: .PP ! 649: A command line argument of the form ! 650: .B \-\_ ! 651: as in ! 652: .LS ! 653: % \*bpxp -_ dirty.p\fR ! 654: .LE ! 655: can be used to cause ! 656: .XP ! 657: to underline all keywords in the output for enhanced readability. ! 658: .SH ! 659: Specify indenting unit \- [23456789] ! 660: .PP ! 661: The normal unit which ! 662: .XP ! 663: uses to indent a structure statement level is 4 spaces. ! 664: By giving an argument of the form ! 665: \fB\-\fId\fR ! 666: with ! 667: .I d ! 668: a digit, ! 669: 2 \(<= ! 670: .I d ! 671: \(<= 9 ! 672: you can specify that ! 673: .I d ! 674: spaces are to be used per level instead. ! 675: .NH 2 ! 676: Pxref ! 677: .PP ! 678: The cross-reference program ! 679: .I pxref ! 680: may be used to make cross-referenced listings of Pascal ! 681: programs. ! 682: To produce a cross-reference of the program in the file ! 683: `foo.p' ! 684: one can execute the command: ! 685: .LS ! 686: % \*bpxref foo.p\fR ! 687: .LE ! 688: The cross-reference is, unfortunately, not block structured. ! 689: Full details on ! 690: .I pxref ! 691: are given in its manual section ! 692: .I pxref ! 693: (1). ! 694: .NH 2 ! 695: Multi-file programs ! 696: .PP ! 697: A text inclusion facility is available with ! 698: .UP . ! 699: This facility allows the interpolation of source text from other ! 700: files into the source stream of the translator. ! 701: It can be used to divide large programs into more manageable pieces ! 702: for ease in editing, listing, and maintenance. ! 703: .PP ! 704: The ! 705: .B include ! 706: facility is based on that of the ! 707: .SM ! 708: UNIX ! 709: .NL ! 710: C compiler. ! 711: To trigger it you can place the character `#' in the first portion of ! 712: a line and then, after an arbitrary number of blanks or tabs, ! 713: the word ! 714: `include' ! 715: followed by a filename enclosed in single `\(aa' or double `"' quotation ! 716: marks. ! 717: The file name may be followed by a semicolon `;' if you wish to treat ! 718: this as a pseudo-Pascal statement. ! 719: The filenames of included files must end in `.i'. ! 720: An example of the use of included files in a main program would be: ! 721: .LS ! 722: \*bprogram\fR compiler(input, output, obj); ! 723: ! 724: #\*binclude\fR "globals.i" ! 725: #\*binclude\fR "scanner.i" ! 726: #\*binclude\fR "parser.i" ! 727: #\*binclude\fR "semantics.i" ! 728: ! 729: \*bbegin\fR ! 730: { main program } ! 731: \*bend\fR. ! 732: .LE ! 733: .PP ! 734: At the point the ! 735: .B include ! 736: pseudo-statement is encountered in the input, the lines from ! 737: the included file are interpolated into the input stream. ! 738: For the purposes of translation and runtime diagnostics and ! 739: statement numbers in the listings and post-mortem backtraces, ! 740: the lines in the included file are numbered from 1. ! 741: Nested includes are possible up to 10 deep. ! 742: .PP ! 743: See the descriptions of the ! 744: .B i ! 745: option of ! 746: .PI ! 747: in section 5.2 ! 748: above; ! 749: this can be used to control listing when ! 750: .B include ! 751: files are present. ! 752: .PP ! 753: When a non-trivial line is encountered in the source text after an ! 754: .B include ! 755: finishes, the ! 756: `popped' filename is printed, in the same manner as above. ! 757: .PP ! 758: For the purposes of error diagnostics when not making a listing, the filename ! 759: will be printed before each diagnostic if the current ! 760: filename has changed since the last ! 761: filename was printed. ! 762: .NH 2 ! 763: Separate Compilation with Pc ! 764: .PP ! 765: A separate compilation facility is provided with the Berkeley Pascal compiler, ! 766: .PC . ! 767: This facility allows programs to be divided into a number of files and ! 768: the pieces to be compiled individually, ! 769: to be linked together at some later time. ! 770: This is especially useful for large programs, ! 771: where small changes would otherwise require ! 772: time-consuming re-compilation of the entire program. ! 773: .PP ! 774: Normally, ! 775: .PC ! 776: expects to be given entire Pascal programs. ! 777: However, if given the ! 778: .B \-c ! 779: option on the command line, it will accept a sequence of definitions and ! 780: declarations, and compile them into a ! 781: .B .o ! 782: file, to be linked with a Pascal program at a later time. ! 783: In order that procedures and functions be available across ! 784: separately compiled files, they must be declared with the directive ! 785: .B external . ! 786: This directive is similar to the directive ! 787: .B forward ! 788: in that it must precede the resolution of the function or procedure, ! 789: and formal parameters and function result types must be specified ! 790: at the ! 791: .B external ! 792: declaration and may not be specified at the resolution. ! 793: .PP ! 794: Type checking is performed across separately compiled files. ! 795: Since Pascal type defintions define unique types, ! 796: any types which are shared between separately compiled files ! 797: must be the same definition. ! 798: This seemingly impossible problem is solved using a facility similar ! 799: to the ! 800: .B include ! 801: facility discussed above. ! 802: Definitions may be placed in files with the extension ! 803: .B .h ! 804: and the files included by separately compiled files. ! 805: Each definition from a ! 806: .B .h ! 807: file defines a unique type, and all uses of a definition from the same ! 808: .B .h ! 809: file define the same type. ! 810: Similarly, the facility is extended to allow the definition of ! 811: .B const s ! 812: and the declaration of ! 813: .B label s, ! 814: .B var s, ! 815: and ! 816: .B external ! 817: .B function s ! 818: and ! 819: .B procedure s. ! 820: Thus ! 821: .B procedure s ! 822: and ! 823: .B function s ! 824: which are used between separately compiled files must be declared ! 825: .B external , ! 826: and must be so declared in a ! 827: .B .h ! 828: file included by any file which calls or resolves the ! 829: .B function ! 830: or ! 831: .B procedure . ! 832: Conversely, ! 833: .B function s ! 834: and ! 835: .B procedure s ! 836: declared ! 837: .B external ! 838: may only be so declared in ! 839: .B .h ! 840: files. ! 841: These files may be included only at the outermost level, ! 842: and thus define or declare global objects. ! 843: Note that since only ! 844: .B external ! 845: .B function ! 846: and ! 847: .B procedure ! 848: declarations (and not resolutions) are allowed in ! 849: .B .h ! 850: files, statically nested ! 851: .B function s ! 852: and ! 853: .B procedure s ! 854: can not be declared ! 855: .B external . ! 856: .PP ! 857: An example of the use of included ! 858: .B .h ! 859: files in a program would be: ! 860: .LS ! 861: \*bprogram\fR compiler(input, output, obj); ! 862: ! 863: #\*binclude\fR "globals.h" ! 864: #\*binclude\fR "scanner.h" ! 865: #\*binclude\fR "parser.h" ! 866: #\*binclude\fR "semantics.h" ! 867: ! 868: \*bbegin\fR ! 869: { main program } ! 870: \*bend\fR. ! 871: .LE ! 872: .PP ! 873: This might include in the main program ! 874: the definitions and declarations of all the global ! 875: .B label s, ! 876: .B const s, ! 877: .B type s and ! 878: .B var s ! 879: from the file globals.h, ! 880: and the ! 881: .B external ! 882: .B function ! 883: and ! 884: .B procedure ! 885: declarations for each of the ! 886: separately compiled files for the scanner, parser and semantics. ! 887: The header file ! 888: .I scanner.h ! 889: would contain declarations of the form: ! 890: .LS ! 891: \*btype\fR ! 892: token = \*brecord\fR ! 893: { token fields } ! 894: \*bend\fR; ! 895: ! 896: \*bfunction\fR scan(\*bvar\fR inputfile: text): token; ! 897: \*bexternal\fR; ! 898: .LE ! 899: .ne 15 ! 900: Then the scanner might be in a separately compiled file containing: ! 901: .LS ! 902: #\*binclude\fR "globals.h" ! 903: #\*binclude\fR "scanner.h" ! 904: ! 905: \*bfunction\fR scan; ! 906: \*bbegin\fR ! 907: { scanner code } ! 908: \*bend\fR; ! 909: .LE ! 910: which includes the same global definitions and declarations ! 911: and resolves the scanner functions and procedures declared ! 912: .B external ! 913: in the file scanner.h.
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.