home *** CD-ROM | disk | FTP | other *** search
/ Simtel MSDOS 1992 June / SIMTEL_0692.cdr / msdos / pascal / qparser.arc / QPDEMO.TXT < prev    next >
Text File  |  1985-09-30  |  12KB  |  391 lines

  1. %0
  2. #1
  3.  
  4.                           @B+@K+Greetings!@B-@K-
  5.  
  6.           ... and thanks for running this brief demo program
  7.  
  8. We're going on a short tour of some of the features of the QPARSER
  9. translator writing system.  Qparser is an LALR(1) parser table generator
  10. that accepts a context-free grammar specification of a language.  Based
  11. on that grammar, it produces a complete ready-to-compile Pascal or C
  12. program that will correctly parse sentences in that language.
  13. $
  14. ~1
  15.  
  16. @R+But it's more...@R-  Qparser is also a complete @U+strategy@U- of
  17. translator construction.  It supplies a @U+semantics action@U- system,
  18. including @U+symbol table functions@U-, @U+semantics stack declarations@U-,
  19. and more.  There are @U+fully worked out@U- example translators, ranging
  20. in complexity from a simple calculator to a Pascal subset compiler.
  21. Finally, there's a companion textbook available from SRA that covers both
  22. the theory and practice of translator design.  It was written by Dr.
  23. William Barrett, who also designed the Qparser system.
  24.  
  25. But let's look at an example.
  26. $
  27. ~2
  28. *
  29. @U+This@U- window will be used for comments on the program shown in the
  30. @U+other@U- window.
  31.  
  32. $
  33. #2
  34. This window will be used to show the effect of running a program.  The
  35. material typed by the program will be shown
  36.  
  37.    like this
  38.  
  39. while the material that @U+you@U- would type will be shown
  40.  
  41.    @R+like this@R-
  42. $
  43. *
  44. #1
  45. *
  46. ~1
  47. ~1
  48. Let's first look at a compiled interpreter, a program called CALC.COM.
  49.  
  50. CALC was prepared by
  51.  
  52.     1. writing a grammar for it (20 lines),
  53.     2. extending one or two data structures (about 5 lines),
  54.     3. writing some Pascal semantics actions (about 60 lines).
  55.  
  56. What we're going to show is the @U+effect@U- of running CALC.  You can
  57. try everything yourself later, following the simple directions in the
  58. Qparser booklet.
  59. $
  60.  
  61.  
  62. ~2
  63. ~2
  64.  
  65. When you execute CALC, you will first get a prompt: ">".  CALC will then
  66. expect a simple arithmetic expression:
  67. #2
  68. *
  69. C> @R+CALC@R-
  70.  
  71. > @R+5 + 6.5*(9-3)@R-
  72. $
  73. #1
  74. *
  75. CALC will reply with the result
  76. #2
  77.    = 44
  78. $
  79. #1
  80. *
  81. You can also write simple assignment statements, such as:
  82. #2
  83. > @R+X := 5 + 15@R-
  84.    = 20
  85. $
  86. #1
  87. *
  88. Once variable X has been defined,
  89. you can use X in other expressions, for example:
  90. #2
  91. > @R+Y := x+5@R-
  92.    = 25
  93. $
  94. #1
  95. *
  96. The point of this exercise is not to run a calculator, but to demonstrate
  97. that a simple @U+grammar@U- and a few lines of @U+semantics@U- are all
  98. you need to produce this interpreter.
  99.  
  100. We're now going to expose some of the inner workings of the CALC parser.
  101. Again, the various debugging and report tools are @U+built into@U- the
  102. Qparser system.  You need only to add a few extensions to make them suit
  103. your special purposes.
  104.  
  105. $
  106. Type the character @R+!@R- before entering an expression, for example,
  107. #2
  108. > @R+! 15 + (17.65*22 - 45)@R-
  109. $
  110. #1
  111.  
  112. The @R+!@R- will bring up a debugging menu before the rest of the line
  113. is scanned; it looks like this:
  114. #2
  115. I(dentifier, D(ebug level, A(ll symbols, C(ontinue? @R+D@R-
  116. $
  117. #1
  118. *
  119. Simply press the first letter of the command you want (you don't
  120. have to press enter).
  121.  
  122. For example, type @R+D@R- to set a debug level.  Then you will see:
  123. #2
  124. Set debug level (0, 1, 2...) ? @R+2@R-
  125. $
  126. #1
  127. Type @R+2@R- (enter), to choose debug level 2.
  128. You'll get the main prompt
  129. again, so type @R+C@R- to continue.  You'll then see this:
  130. #2
  131. I(dentifier, D(ebug level, A(ll symbols, C(ontinue? @R+C@R-
  132.   <integer>                  FIXED:   15
  133. Primary -> <integer>
  134. I(dentifier, D(ebug level, A(ll symbols, C(ontinue? @R+C@R-
  135. $
  136. #1
  137. *
  138. This says that the @U+semantics stack@U- contains one item, the first
  139. integer in the input stream (15).  FIXED refers to its type.  The
  140. last line,
  141.  
  142.    Primary -> <integer>
  143.  
  144. is the grammar rule that is about to be applied.  The integer 15 will be
  145. @U+reduced@U- to a @U+Primary@U-.
  146. $
  147.  
  148. When you type @R+C@R-, you'll see the result of applying the "Primary"
  149. grammar rule.  You'll also see the rule about to be applied:
  150. #2
  151.    Primary                   FLOAT:  1.500E+01
  152. Expr -> Term
  153. I(dentifier, D(ebug level, A(ll symbols, C(ontinue? @R+C@R-
  154. $
  155. #1
  156. *
  157. This announces that the fixed point number 15 has been converted into a
  158. floating point number.  That action was part of the semantics action
  159. Pascal code written for CALC.  When you hit @R+C@R- again:
  160. #2
  161.    Expr                      FLOAT:  1.500E+01
  162.    +                         OTHER
  163.    (                         OTHER
  164.    <real>                    FLOAT:  1.765E+01      <=== (Top of Stack)
  165. Primary -> <real>
  166. I(dentifier, D(ebug level, A(ll symbols, C(ontinue? @R+C@R-
  167. $
  168. #1
  169. *
  170. Now it's getting interesting.  The semantics stack carries four items.
  171. The @U+Expr@U- is at the bottom of the stack and the @U+<real>@U- is on
  172. top.  Recall that our expression was
  173.  
  174.     @R+15 + ( 17.65@R- *22 - 45)
  175.  
  176. The parser has worked through the highlighted portion; the rest hasn't
  177. been scanned yet.  You can see the trail left in the stack; the @R+15@R-
  178. is the @U+Expr@U-, and the @R+17.65@R- is the @U+<real>@U-.
  179. $
  180.  
  181. ~2
  182. Push @R+C@R- twice; we'll skip one step involving the production
  183. Primary -> <integer>.  You'll see this displayed:
  184. #2
  185. I(dentifier, D(ebug level, A(ll symbols, C(ontinue? @R+C@R_
  186.    Expr                      FLOAT:  1.500E+01
  187.    +                         OTHER
  188.    (                         OTHER
  189.    Primary                   FLOAT:  1.765E+01
  190.    *                         OTHER
  191.    Primary                   FLOAT:  2.200E+01      <=== (Top of Stack)
  192. Term -> Term * Fact
  193. I(dentifier, D(ebug level, A(ll symbols, C(ontinue? @R+C@R-
  194. $
  195. #1
  196. ~1
  197. *
  198. At this and every other point in the parsing, the
  199.    @K+top stack elements correspond to the grammar rule's right part@K-
  200. The names may not always agree, owing to a single production optimization
  201. made by Qparser, but the positions always will.  In this case,
  202.  
  203.    Term   corresponds to:   Primary     FLOAT:  1.765E+01
  204.    *      corresponds to:   *
  205.    Fact   corresponds to:   Primary     FLOAT:  2.200E+01
  206. $
  207.  
  208. Notice how the stack top corresponds to the right-most member of the rule.
  209. When you type @R+C@R-, these three elements will be replaced by a single
  210. element, which is the rule's left member:
  211. #2
  212.    Expr                      FLOAT:  1.500E+01
  213.    +                         OTHER
  214.    (                         OTHER
  215.    Primary                   FLOAT:  3.883E+02      <=== (Top of Stack)
  216. Expr -> Term
  217. I(dentifier, D(ebug level, A(ll symbols, C(ontinue? @R+C@R-
  218. $
  219. #1
  220. *
  221. Also notice how the product of 17.65 and 22 has been carried out, and the
  222. result (388.3) has been placed on the stack.  That @U+semantic action@U-
  223. is part of the Pascal code that must be written by you as the user.
  224.  
  225.  
  226.  
  227. $
  228. #2
  229. *
  230. #1
  231. *
  232. ~1
  233. ~1
  234. ~1
  235. ~1
  236. ~1
  237. ~1
  238. ~1
  239. ~1
  240. ~1
  241. This brief demo should give you a feel for the Qparser system, which
  242. can solve several algorithmic tasks for you:
  243.  
  244.    * The derivation of an input string has been uncovered and reproduced
  245.      as production rule operations.
  246.  
  247.    * Information is carried on the semantics until needed later.
  248.  
  249.    * Names and numbers are scanned and put into the stack at the right
  250.      place.
  251.  
  252.    * When each production rule pops up, the top of the semantics stack
  253.      carries just what is needed for the operation that it implies.
  254.  
  255. The semantic actions must be coded by you in Pascal
  256. or C -- but Qparser provides a convenient and powerful framework
  257. for doing this.
  258.  
  259. $
  260. *
  261. We invite you to actually run CALC yourself.  You've
  262. already figured out how to run this demo program; use the same
  263. execution sequence to run CALC.  We recommend setting DOS to the
  264. disk drive name that contains the demo diskette, for example,
  265.  
  266. C> @R+A:@R-
  267. A>
  268.  
  269. will set the default disk drive to drive A.
  270.  
  271.  
  272. $
  273. *
  274. Try some experiments, such as the following:
  275.  
  276.    Look at names by choosing the @R+I@R-(dentifier option.
  277.  
  278.    Make a syntax error and see what happens.
  279.  
  280.    Choose a lower or higher debug level:
  281.       1 is production rule only
  282.       2 is the stack and production rule
  283.       3 shows READ and LOOKAHEAD actions (for those who know how LR
  284.           parsers work)
  285.       4 shows lots of detail during error recovery
  286.  
  287.  
  288. $
  289. After you've tried that, try running LR1 on the CALC grammar.  When
  290. you type LR1 by itself --
  291.  
  292. C> @R+LR1@R-
  293.  
  294. -- you will get a screen full of options.  Choose
  295. a report level greater than 0, for example,
  296.  
  297. C> @R+LR1 CALC -L3@R-
  298.  
  299.  
  300. $
  301. You'll get lots more information scrolling across the screen.  Hit
  302. @R+control-S@R- to stop the scrolling, and @R+control-Q@R- to continue.
  303.  
  304. If you are familiar with LR item-sets, you'll see these produced.  The
  305. last table produced is a state-by-state description of the LR parser
  306. finite-state machine.
  307.  
  308.  
  309. $
  310. *
  311. LR1 will try to write a table file to your demo diskette.
  312. There isn't much room on that diskette, so we suggest
  313. transferring the demo files to another diskette.
  314.  
  315. Since Qparser can easily produce voluminous Pascal source files,
  316. we recommend a system with a hard disc.  A large grammar will
  317. also need considerable memory -- 512 Kbytes minimum is recommended.
  318.  
  319.  
  320. $
  321. We suggest actually generating a full parser.  Start with CALC, since
  322. it's all worked out.  Just enter these commands:
  323.  
  324. C> @R+LR1 CALC@R-
  325. C> @R+LR1P CALC -s CALCSKEL@R-
  326.  
  327.  
  328. $
  329. These commands should produce a source file CALC.PAS, which you can
  330. examine with an editor.  We suggest comparing it to the source file
  331. CALCSKEL.PAS.  Qparser has converted the "skeleton" file CALCSKEL into
  332. the syntactically correct Pascal source file CALC.PAS.  You should also
  333. take a look at the grammar CALC.GRM, and compare the production rules
  334. with the semantic program information found in the procedure APPLY.
  335.  
  336. (Alternately you could use LR1SKEL with the CALC grammar --
  337.  
  338. C> @R+LR1P CALC -s LR1SKEL@R-
  339.  
  340. to generate a working program which recognizes the same grammar but
  341. behaves very differently. )
  342.  
  343.  
  344. $
  345. CALC.PAS contains several @B+include directives@B-, i.e. statements
  346. directing the compiler to include code from another file -- look for
  347. lines containing @U+{$I@U- followed by a file name in the CALC.PAS source.
  348. The named files have to be available when you compile CALC.
  349.  
  350.  
  351. $
  352. We recommend using the Turbo Pascal compiler, vs. 2.0 or later.  However,
  353. you can also modify CALCSKEL and its  include files to suit some other
  354. Pascal compiler.  Just try compiling CALC and see where the syntax errors
  355. occur -- it should be clear how to make the necessary changes.
  356.  
  357. Note that by changing a skeleton file's syntax, you also change all the
  358. generated files, so you only have to do that once.  In fact, the full
  359. Qparser system contains a set of C skeletons, enabling you to produce a
  360. translator in C.
  361.  
  362.  
  363. $
  364. *
  365. The full Qparser system also contains a simulator, an assembler and
  366. a subset Pascal compiler.  These are valuable resources in developing a
  367. translator system, or for instructional purposes.
  368.  
  369. The companion textbook, @U+Compiler Construction: Theory and Practice@U-,
  370. can now be ordered from Science Research Associates, Chicago.  This
  371. text has been adopted by many colleges and universities, and covers the
  372. concepts of Qparser in considerable detail.
  373.  
  374.  
  375. $
  376. *
  377. Thanks for running me.  Follow the instructions in the demo booklet for
  378. some interesting experiments that you can run with QPARSER.  Happy parsing!
  379.  
  380.  
  381.                           QCAD Systems, Inc.
  382.  
  383.                           San Jose, CA 95129
  384.                             (408) 727-6671
  385.                   Toll-free Order Line: (800) 538-9787
  386.  
  387.  
  388.  
  389.  
  390.  
  391.