home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk1.iso / altsrc / articles / 11188 < prev    next >
Text File  |  1994-08-27  |  27KB  |  530 lines

  1. Newsgroups: alt.sources
  2. Path: wupost!howland.reston.ans.net!vixen.cso.uiuc.edu!uchinews!quads!goer
  3. From: goer@quads.uchicago.edu (Richard L. Goerwitz)
  4. Subject: IBPAG2, part 08
  5. Message-ID: <1994Aug28.042237.25416@midway.uchicago.edu>
  6. Sender: news@uchinews.uchicago.edu (News System)
  7. Reply-To: goer@midway.uchicago.edu
  8. Organization: University of Chicago
  9. References: <1994Aug28.041715.24693@midway.uchicago.edu>
  10. Date: Sun, 28 Aug 1994 04:22:37 GMT
  11. Lines: 517
  12.  
  13. #!/bin/sh
  14. # this is part 8 of a multipart archive
  15. # do not concatenate these parts, unpack them in order with /bin/sh
  16. # file README continued
  17. #
  18. CurArch=8
  19. if test ! -r s2_seq_.tmp
  20. then echo "Please unpack part 1 first!"
  21.      exit 1; fi
  22. ( read Scheck
  23.   if test "$Scheck" != $CurArch
  24.   then echo "Please unpack part $Scheck next!"
  25.        exit 1;
  26.   else exit 0; fi
  27. ) < s2_seq_.tmp || exit 1
  28. sed 's/^X//' << 'SHAR_EOF' >> README
  29. X
  30. X        1) YACC's "$$ = x" constructs are replaced by "return x" (e.g.
  31. X           "$$ = $1 + $3" -> "return $1 + $3" [$1 is a synonym for
  32. X       "arg1", $3 for "arg3", etc.])
  33. X
  34. X        2) all variables within a given action are, by default, local
  35. X           to that action; i.e. they cannot be accessed by other
  36. X           actions unless you declare them global elsewhere (e.g. in
  37. X           the pass-through part of the declarations section %{ ...
  38. X           %})
  39. X
  40. X        3) the %union and %type declarations/tags are not needed by
  41. X       Ibpag2 (both for better and for worse)
  42. X
  43. X        4) tokens and symbols are separated from each other by a comma
  44. X           in Ibpag2 files (e.g. %token '+', '-' and S : NP, VP)
  45. X
  46. X        5) epsilon is indicated by the keyword "epsilon" (e.g. REL :
  47. X           epsilon), and not by an empty RHS
  48. X
  49. X        6) both epsilon and error *may* be declared as %tokens for
  50. X           reasons of precedence, although they retain hard-coded
  51. X           internal values (-2 and -1, respectively)
  52. X
  53. X        7) all actions must follow the last RHS symbol of the rule
  54. X           they apply to (preceded by an optional %prec directive); to
  55. X           achieve S : NP { action1 }, VP { action2 }, insert a dummy
  56. X           rule: S : NP, dummy, VP { action2 }; dummy : epsilon {
  57. X           action1 } ;
  58. X
  59. X        8) YYERROR, YYACCEPT, yyclearin, and yyerrok are the same,
  60. X           except they are written IIERROR, IIACCEPT, iiclearin, and
  61. X           iierrok (i.e. "ii" replaces "yy")
  62. X
  63. X        9) Ibpag2's input files are tokenized as modified Icon files,
  64. X           and, as a consequence, Icon's reserved words must not be
  65. X           used as symbols (e.g. "if : if, then" is no go)
  66. X
  67. XI myself find YACC to be ugly.  As a result, Ibpag2 is not an exact
  68. XYACC clone.  I would like to underscore the fact that I have no
  69. Xintention to move in this direction, either.  It's as YACC-like as
  70. Xit's going to get!
  71. X
  72. X    Both YACC and non-YACC users should note number 9 in the above
  73. Xlist.  Don't use things like "while," "every," "do," etc. as symbols
  74. Xin your grammar!  Just use the same rules for Ibpag2 nonterminals as
  75. Xfor Icon variables, and you'll be OK.
  76. X
  77. X    For those that just can't bear using anything but a strictly
  78. XYACC-conformant system, I've included a preprocessor with the Ibpag2
  79. Xdistribution called (at one user's recommendation) "iacc."  Iacc reads
  80. X&input - assumed to be a YACCish grammar - and sends to &output an
  81. XIbpag2-conformant file.  I have not tested this file extensively, and
  82. Xthere are likely to be bugs in the way I've handled the necessary 2
  83. Xtoken lookaheads and value stack references.  Give it a whirl, though,
  84. Xif you are feeling adventurous.  The only reason I personally use Iacc
  85. Xis that some YACCs (e.g. BSD YACC) have particularly nice debugging
  86. Xmessages and help.  If my grammar is particularly complex, I just run
  87. Xit through YACC without action code first, then use Iacc to convert it
  88. Xto Ibpag2 format.  Iacc's output, as I noted, is not meant to be
  89. Xpretty, so I invariably end up doing a little editing - usually just
  90. Xrespacing a few rules, and re-inserting any comments that I might have
  91. Xput in the original YACC file.
  92. X
  93. X    In general, Ibpag2 (like YACC) handles epsilon moves and
  94. Xindirect cycles.  LR-mode shift-reduce conflicts are also handled in
  95. Xthe normal way (i.e. pick the rule with the highest priority, and, in
  96. Xcases where the priority is the same, check the associativities).  In
  97. Xcontrast to YACC, Ibpag2 flags reduce/reduce conflicts as errors
  98. X(since these often conceal deeper precedence problems and just plain
  99. Xkludges).  Reduce/reduce conflict errors are easily enough remedied,
  100. Xif need be, via (dummy) precedences.  One can convert these errors to
  101. Xwarnings by specifying -y on the command line.  With the -y option,
  102. Xreduce/reduce conflicts are resolved in favor of the rule that occurs
  103. Xfirst in the grammar.  The -y switch also prevents Ibpag2 from
  104. Xaborting on shift/reduce conflicts, telling it instead to resolve in
  105. Xfavor of shift.  Basically, -y is a partial YACC compatibility switch.
  106. XNormally (i.e. in SLR mode) Ibpag2 is much more finicky than YACC
  107. Xabout conflicts in its grammars.
  108. X
  109. X    Also in contrast to YACC, Ibpag2 supports multiple
  110. Xsimultaneous parsers.  Ibpag2 normally names its main parser routine
  111. Xiiparse().  By using the -m command-line option, however, you can
  112. Xoverride this default behavior, and force Ibpag2 to augment this name
  113. Xin some uniquely identifiable fashion.  For example, "ibpag2 -m _1 <
  114. Xtmp.ibp > tmp.icn" will force Ibpag2 to write a parser called
  115. X"iiparse_1" to tmp.icn.  Note that, instead of calling iilex, this
  116. Xiiparse_1() routine will now call iilex_1, and all necessary global
  117. Xvariables will have _1 appended to them (e.g. errors will become
  118. Xerrors_1).  I don't expect that many people will have occasion to use
  119. Xthis feature.  It is there, though, for those that want it.
  120. X
  121. X
  122. X4.__Debugging
  123. X
  124. X    Constructing and debugging LR(1) family parsers can sometimes
  125. Xbe hair raising, even with a parser generator.  Several precautions
  126. Xcan be taken, however, to minimize the agony.  The first is to declare
  127. Xall tokens initially as part of a single %token declaration, i.e. with
  128. Xno precedences, and with the same associativities.  Also, leave out
  129. Xaction code until the grammar seems to be working.  In this stage, you
  130. Xcan even run the grammar through (BSD)YACC or GNU Bison.  All you
  131. Xwould need to do is remove the commas between tokens and symbols, and
  132. Xplace a semicolon at the end of every rule.  During this and all
  133. Xdebugging stages, supply Ibpag2 with a -v command-line switch.  This
  134. Xwill cause Ibpag2 to write a summary of rules, tokens, and its two
  135. Xstate tables to "ibpag2.output" (a bit like GNU Bison, but with a
  136. Xhard-coded name).  If you get messages about conflicts in your parse
  137. Xtables (e.g.  "unresolvable reduce/reduce conflict, state 5, token
  138. X257, rules 4,5").  This file will tell you what rules these are, and
  139. Xwhat token number 257 is.  Use precedences and associativities to
  140. Xclear these problems up as they arise.  If you are comfortable having
  141. Xreduce/reduce errors resolved by the order in which the conflicting
  142. Xrules occur, then use the -y command-line switch.  With -y on the
  143. Xcommand line, Ibpag2 will always resolve in favor of the earlier rule.
  144. XThis option will also cause it to resolve all shift/reduce conflicts
  145. Xin favor of shift.
  146. X
  147. X    There are certain languages that are not ambiguous that SLR(1)
  148. Xparsers like Ibpag2 will fail to produce an unambiguous parse table
  149. Xfor.  The classic example is
  150. X
  151. X    expr : lval, '=', rval | rval
  152. X    lval : '*', rval       | ID
  153. X    rval : lval
  154. X
  155. XC programmers will recognize this as a toy expression grammar with
  156. Xcode for identifiers, assignments, and pointers.  The problem is that
  157. Xif we feed this grammar to Ibpag2, it will claim that there is a
  158. Xconflict on lookahead '='.  In truth, there is no ambiguity.  The SLR
  159. Xparser simply doesn't remember the pathway the parser used to get to
  160. Xthe state it is in when it sees '=' on the input stream.  Whether the
  161. Xparser gets into this state by seeing '*' plus and ID, or by seeing
  162. Xjust an ID, it knows to turn the ID into an lval.  Then it knows to
  163. Xturn lval into rval.  At this point, though, it doesn't know whether
  164. Xto shift the = sign via rule 1, or to turn rval and the preceding '*'
  165. Xinto an lval.  The parser has "forgotten" that the '*' is there
  166. Xwaiting on level down on the stack!
  167. X
  168. X    The solution to this problem is actually quite simple (at
  169. Xleast in concept).  Just provide a unique pathway in the grammar for
  170. Xthe conflicting rules.  In this case, they are rules 1 and 5 (the
  171. Xfirst and last):
  172. X
  173. X    expr : lval, '=', rval | rval
  174. X    lval : '*', pval | ID
  175. X    pval : lval
  176. X    rval : lval
  177. X
  178. XNow when the parser sees '*,' it can only have a pval after it.  Never
  179. Xmind that pval is composed of precisely the same things as rval.  The
  180. Xpoint is that the parser generator follows a different route after
  181. Xseeing '*' than if it starts with ID and no preceding '*'.  Hence it
  182. X"remembers" that that the '*' is back on the stack, waiting for the
  183. X"lval : '*', pval" rule to apply.  There is no more conflict.
  184. X
  185. X    Go ahead and run these grammars through Ibpag2 if you aren't
  186. Xsure what is going on.  Remember to declare ID as a token, and to
  187. Xplace "%%" in the appropriate spot!
  188. X
  189. X    If you get your parser up and running, but find that it is not
  190. Xfunctioning quite the way you expect, add the following line somewhere
  191. Xnear the start of Ibpag2's output file:
  192. X
  193. X    $define IIDEBUG
  194. X
  195. XIf you like, you can add it to the beginning of your Ibpag2 input
  196. Xfile.  Place it in the declarations section (before the first double
  197. Xpercent sign), and surround it by %{ and %}, e.g.:
  198. X
  199. X    %{
  200. X    $define IIDEBUG
  201. X    %}
  202. X
  203. XThis tells Ibpag2 to send $define IIDEBUG straight through to the
  204. Xoutput file.
  205. X
  206. X    What defining IIDEBUG does is tell iiparse, once compiled, to
  207. Xemit profuse debugging messages about the parser's actions, and about
  208. Xthe state of its stacks.  This display will not make a whole lot of
  209. Xsense to anyone who doesn't understand LR-family parsers, so those who
  210. Xwant to access this feature should perhaps go through a standard
  211. Xreference like Aho, Sethi, and Ullman [1].
  212. X
  213. X    If, after you are finished debugging your grammar, you find
  214. Xthat Ibpag2's output files are rather large, you may try saving space
  215. Xby compressing the action and goto tables.  This is accomplished by
  216. Xinvoking Ibpag2 with the -c (compress) option.  Using this option
  217. Xmakes debugging difficult, and makes the parser run a bit more slowly.
  218. XIt also only works for rather large grammars with long nonterminal
  219. Xsymbol names.  Don't even consider it until the grammar is thoroughly
  220. Xdebugged and you have determined that the output file's size is just
  221. Xtoo great for practical use.  Even then, compression may or may not
  222. Xhelp, depending on how long your nonterminal names are.  In general,
  223. XIbpag2 is best as a teaching tool, or as a production system for
  224. Xmedium or small grammars.
  225. X
  226. X
  227. X5.__Using_Ibpag2_with_Non-LR_Grammars
  228. X
  229. X    There may be times when you *want* to parse languages that no
  230. XLR-based algorithm can handle.  There may be times, that is, when the
  231. Xgrammar you want to use contains conflicts or ambiguities that are
  232. Xthere by design, and not by oversight.  For example, you may want to
  233. Xparse a natural language.  Full-blown natural languages involve many
  234. Xhighly ambiguous constructs, and are not LR-parsable.  By invoking it
  235. Xwith the -a option, Ibpag2 can parse or recognize certain natural
  236. Xlanguages, or, more practically speaking, certain NL subsets.  The
  237. Xletter "a" in -a is supposed to stand for "ambiguous," although what
  238. Xthis option really does is put Ibpag2 into a quasi-GLR mode - i.e.
  239. Xinto a kind of "generalized" LR mode in which it can accept non-LR
  240. Xgrammars [4,5].
  241. X
  242. X    User-visible changes to Ibpag2's operation in quasi-GLR mode
  243. X(i.e. with the -a option) are as follows:
  244. X
  245. X    1) iiparse() is now a generator
  246. X    2) action code can use suspend as well as return
  247. X    3) IIERROR places the current thread in an error state (i.e.
  248. X       it doesn't *necessarily* trigger error recovery; see below)
  249. X    4) there are two new action-code directives (iiprune and
  250. X           iiisolate) and a general define (AUTO_PRUNE)
  251. X    5) conflicts due to ambiguities in the grammar no longer
  252. X       result in aborted processing (so, e.g., if you do not
  253. X       specify the -y option on a grammar with reduce/reduce
  254. X       conflicts, Ibpag2 will simply generate a parser capable of
  255. X       producing multiple parses for the same input)
  256. X
  257. X    In quasi-GLR mode, iiparse() should be invoked in a way that
  258. Xwill render multiple results usable, if they are available (e.g.
  259. X"every result := iiparse(&input) do...".  Action code is also allowed
  260. Xto produce more than one value (i.e. to use suspend).  When it does
  261. Xso, iiparse() creates separate parse threads for each value.  So, for
  262. Xinstance, if your action code for some production suspends both of the
  263. Xfollowing lists,
  264. X
  265. X    ["noun", "will", "gloss: desire"]
  266. X    ["noun", "will", "gloss: legal document mandating how _
  267. X                      one's possessions are to be disposed _
  268. X              of after one's death"],
  269. X
  270. Xiiparse() would create two separate parse threads - one for each
  271. Xresult.  Note that in this case, the syntactic structure of each
  272. Xthread is the same.  It is their semantics (i.e. the stuff on the
  273. Xvalue stack) that differs.
  274. X
  275. X    If you use the iierrok and iiclearin macros in your action
  276. Xcode before suspending any result, their affect persists through all
  277. Xsubseqent suspensions and resulting parse threads.  If you use these
  278. Xmacros after suspending one or more times, however, they are valid
  279. Xonly for the parse thread generated by the next suspension.  By way of
  280. Xcontrast, the IIERROR macro *always* flags only the next parse thread
  281. Xas erroneous.  Likewise, IIACCEPT always simulates an accept action on
  282. Xthe next suspension only.  IIERROR and IIACCEPT, in other words, never
  283. Xhave any effect on subsequent suspensions and parse threads other than
  284. Xthe one that immediately follows them.  This is true of iierrok and
  285. Xiiclearin only when used after the first suspension.
  286. X
  287. X    In quasi-GLR mode, IIERROR (number three in the difference
  288. Xlist above) becomes a mechanism for placing the current parse thread
  289. Xin error mode.  This is similar to, but not quite identical to, how
  290. XIIERROR functions in straight LR mode.  In quasi-GLR mode, if other
  291. Xthreads can carry on the parse without error the erroneous parse
  292. Xthread is quietly clobbered.  Full-blown error recovery only occurs if
  293. Xall of the other parsers halt as well.  This makes sense if you think
  294. Xabout it.  Why keep erroneous threads around when there are threads
  295. Xstill continuing a valid parse?  For some large interactive systems,
  296. Xit might be necessary to keep bogus threads around longer, and weed
  297. Xthem out only after a lengthy grading process.  If you are
  298. Xconstructing a system such as this, you'll have to modify Ibpag2's
  299. Xiiglrpar.lib file.  In particular, you'll need to change the segment
  300. Xin iiparse() that takes out the trash, so to speak, in such a way that
  301. Xit does so only if the error count in a given parser either rises
  302. Xabove a specific threshhold or else exceeds the number of errors in
  303. Xthe "most correct" parser by a certain amount.  This is not that hard
  304. Xto do.  I just don't expect that most parsers people generate with
  305. XIbpag2 will use IIERROR or error recovery in general in so involved a
  306. Xfashion.
  307. X
  308. X    Iiprune and iiisolate (number 4 above) are used to control the
  309. Xgrowth of the parallel parser array.  In order to give straightforward
  310. X(read "implementationally trivial") support for action code, Ibpag2
  311. Xcannot create a parse "forest" in the sense that a standard GLR parser
  312. Xdoes.  Instead, it simply duplicates the current parser environment
  313. Xwhenever it encounters a conflict in its action table.  Even if the
  314. Xconflict turns out to reflect only a local ambiguity, the parsers, by
  315. Xdefault, remain separate.  Put differently, Ibpag2's quasi-GLR parser,
  316. Xby default, makes no direct effort to reduce the size of its parser
  317. Xarrays or to alter the essentially linear structure of their value and
  318. Xstate stacks.  Size reduction, where necessary and/or desirable, is up
  319. Xto the programmer.  What the iiprune macro is there to do is to give
  320. Xthe programmer a way of pruning a given thread out of the active
  321. Xparser list.  Iiisolate allows him or her to prune out every thread
  322. X*but* the current one.  AUTO_PRUNE makes the parser behave more like a
  323. Xstandard GLR parser, instructing it to prune parse threads that are
  324. Xessentially duplicating another parse thread's efforts.  The parser,
  325. Xthough, does not build a parse tree per se, the way most GLR parsers
  326. Xtypically do, but rather manipulates its value stack like a
  327. Xtraditional LR-family parser.
  328. X
  329. X    Iiprune is useful when, for example, the semantics (i.e. your
  330. X"action" code segments) determine that a given parse thread is no
  331. Xlonger viable, and you want to signal the syntactic analyzer not to
  332. Xcontinue pursuing it.  The difference between iiprune and IIERROR is
  333. Xthat iiprune clobbers the current parser immediately.  IIERROR only
  334. Xputs it into an error state.  If all active parsers end up in an error
  335. Xstate, and none can shift additional input symbols, then the IIERROR
  336. Xmacro induces error recovery.  Iiprune does not.  NB: iiprune, if used
  337. Xin action code that suspends multiple results, cancels the current and
  338. Xremaining results (i.e. it does not clobber parsers already spun off
  339. Xby previous suspensions by invocation of that same code; it merely
  340. Xcuts the result sequence).  Iiprune essentially stands in for "fail"
  341. Xin this situation.  Fail itself can be used in the code, but be warned
  342. Xthat iiparse() will still push *at least one* value onto its value
  343. Xstack, even if a given action code segment fails.  This keeps the
  344. Xvalue stack in sync with the syntax.  To avoid confusion, I recommend
  345. Xnot using "fail" in any action code.
  346. X
  347. X    Iiisolate is useful if, during error recovery, you prompt the
  348. Xuser interactively, or do something else that cannot be elegantly done
  349. Xin parallel for two or more distinct parse threads.  Iiisolate allows
  350. Xyou to preserve only the the current parse thread, and to clobber the
  351. Xrest.  Iiisolate can also be useful as a way of making sure that only
  352. Xone thread carries on the parse in non-error situations.  Suppose that
  353. Xwe have a series of productions:
  354. X
  355. X    sentences  :  sentences sentence '\n'
  356. X            { print_parse(arg2) }
  357. X           |  sentences '\n'
  358. X           |  error '\n'
  359. X           |  epsilon
  360. X
  361. XIf we get a sentence with more than one parse, all of the underlying
  362. Xthreads that produced these parses will be active for the next
  363. Xsentence as well.  In many situations this will not be what we want.
  364. XIf our desire it to have only one active parse thread at the start of
  365. Xeach sentence, we simply tell our lexical analyzer to suspend two
  366. Xnewlines every time it sees a newline on the input stream.  This
  367. Xinsures that the second rule will always apply right after the first.
  368. XWe then insert iiisolate directives for both it and the one error
  369. Xproduction:
  370. X
  371. X    sentences  :  sentences sentence '\n'
  372. X            { print_parse(arg2) }
  373. X           |  sentences '\n'
  374. X            { iiisolate }
  375. X           |  error '\n'
  376. X            { iiisolate; iierrok }
  377. X           |  epsilon
  378. X
  379. XThe effect here is to allow multiple parsers to be generated only
  380. Xwhile parsing "sentence".  The iiisolate directive, in other words,
  381. Xsees to it that no sentence parse will ever begin with multiple active
  382. Xparsers.  As with LR mode, iierrok clears the error flag for the
  383. X(current) parser.
  384. X
  385. X    Note that if you use iiisolate in action code that suspends
  386. Xmultiple results, iiisolate will clobber all parsers but the one
  387. Xgenerated by the next suspension.
  388. X
  389. X    If there is no need for close control over the details of the
  390. Xparser array, and you wish only to clobber parsers that end up doing
  391. Xthe same thing as some other parser (and hence returning identical
  392. Xvalues), then just make sure you add "$define AUTO_PRUNE" to the
  393. Xpass-through code section at the top of the file.  Put differently,
  394. Xdefining AUTO_PRUNE instructs the quasi-GLR parser to weed out parsers
  395. Xthat are in the same state, and which have identical value stacks.
  396. XAUTO_PRUNE can often be used in place of iiisolate in situations like
  397. Xthe one discussed just above.  Its only drawback is that it slows
  398. Xthe parser a bit.
  399. X
  400. X    Other than these deviations (action code and iiparse becoming
  401. Xgenerators, IIERROR's altered behavior, and the addition of iiprune,
  402. Xiiisolate, and AUTO_PRUNE), Ibpag2's quasi-GLR mode - at least on the
  403. Xsurface - works pretty much like its straight LR mode.  In fact, if
  404. Xyou take one of your SLR(1) grammars, and run it through Ibpag2 using
  405. Xthe -a option, you probably won't notice any difference in the
  406. Xresulting automaton unless you do some debugging or perform some
  407. Xtiming tests (the GLR parser is slower, though for straight SLR(1)
  408. Xgrammars not by much).  Even with non-SLR(1) grammars, the quasi-GLR
  409. Xparser will clip along merrily, using all the same sorts of rules,
  410. Xaction code, and macros that you would typically use in LR mode!
  411. X
  412. X
  413. X6.__Installing_Ibpag
  414. X
  415. X    If you are a UNIX user, or have a generic "make" utility, you
  416. Xare in luck.  Just edit Makefile.dist according to the directions
  417. Xgiven in that file, rename it as "makefile," then execute "make."
  418. XIbpag2 should be created automatically.  If everything goes smoothly,
  419. Xthen "make install" (su-ing root, if both possible and necessary for
  420. Xcorrect installation of the iiparse.icn file).  Check with your system
  421. Xadministrator if you are on a public system, and aren't sure what to
  422. Xdo.
  423. X
  424. X    Please be sure to read the directions in the makefile
  425. Xcarefully, and set DESTDIR and LIBDIR to the directory where you want
  426. Xthe executable and parser file to reside.  Also, make sure the paths
  427. Xyou specify are correct for your Icon executables.  Although Ibpag2
  428. Xwill apparently compile using iconc, I would recommend using the
  429. Xinterpreter, icont, first, unless you are planning on working with a
  430. Xlarge grammar.
  431. X
  432. X    If you are using some other system - one that lacks "make" -
  433. Xthen shame on your manufacturer :-).  You'll be a bit inconvenienced.
  434. XTry typing:
  435. X
  436. X    icont -o ibpag2 follow.icn ibpag2.icn ibreader.icn \
  437. X         ibtokens.icn ibutil.icn ibwriter.icn iohno.icn \
  438. X         outbits.icn slritems.icn slrtbls.icn shrnktbl.icn \
  439. X         version.icn slshupto.icn
  440. X
  441. XThe backslashes merely indicate that the next line is a continuation.
  442. XThe whole thing should, in other words, be on a single line.  As noted
  443. Xabove, you may compile rather than interpret - if your OS supports the
  444. XIcon compiler.  Just replace "icont" above with "iconc."  The
  445. Xresulting executable will run considerably faster than with "icont,"
  446. Xalthough the time required to compile it may be large, and the (still
  447. Xsomewhat experimental) compiler may not work smoothly in all
  448. Xenvironments.
  449. X
  450. X    If your operating system support environment variables, and
  451. Xyou have set up your LPATH according to the specifications in the Icon
  452. Xdistribution (see below), then you may copy iiparse.lib and
  453. Xiiglrpar.lib to some file in your LPATH.  If you do not do this, or if
  454. Xyour OS does not support environment variables, then you must be in
  455. Xthe directory where you keep your Ibpag2 files when you use it, or
  456. Xelse invoke Ibpag2 with the -p dirname option (where dirname is the
  457. Xdirectory that holds the iiparse.lib and iiglrpar.lib files that come
  458. Xwith the Ibpag2 distribution).  The .lib files contain template
  459. Xparsers that are critical to Ibpag2's operation.  Ibpag2 will abort if
  460. Xit cannot find them.
  461. X
  462. X    If your operating system permits the creation of macros or
  463. Xbatch files, it might be useful to create one that changes
  464. Xautomatically to the Ibpag2 source directory, and runs the executable.
  465. XThis has the side-benefit of making it easier for Ibapg2 to find the
  466. Xparser library files, iiparse.lib and iiglrpar.lib.  Under DOS, for
  467. Xinstance, one might create a batch file that says:
  468. X
  469. X    c:
  470. X    cd c:\ibpag2
  471. X    iconx ibpag2 %1 %2 %3 %4 %5 %6 %7 %8 %9
  472. X
  473. XDOS, it turns out, has to execute Icon files indirectly through iconx,
  474. Xso this technique has yet another advantage in that it hides the
  475. Xsecond level of indirection - although it prevents you from using
  476. Xinput and output redirection.  Naturally, the above example assumes
  477. Xthat Ibpag2 is in c:\ibpag2.
  478. X
  479. X    Ibpag2 assumes the existence on your system, not only of an
  480. XIcon interpreter or compiler, but also of an up-to-date Icon Program
  481. XLibrary.  There are several routines included in the IPL that Bibleref
  482. Xuses.  Make sure you (or the local system administrators) have put the
  483. XIPL online, and have translated the appropriate object modules.  Set
  484. Xyour IPATH environment variable to point to the place where the object
  485. Xmodules reside.  Set LPATH to point to the modules' source files.
  486. XBoth IPATH and LPATH are documented in doc directory of the Icon
  487. Xsource tree (ipd224.doc).  If your system does not support environment
  488. Xvariables, copy ximage.icn, options.icn, ebcdic.icn, and escape.icn
  489. Xfrom the IPL into the Ibpag2 source directory, and compile them in
  490. Xwith the rest of the Ibpag2 source files, either by adding them to the
  491. XSRC variable in the makefile, or by adding them manually to the "icont
  492. X-o ..." command line given above.
  493. X
  494. X    If you have any problems installing or using Ibpag2, please
  495. Xfeel free to drop me, Richard Goerwitz, an e-mail message at
  496. Xgoer@midway.uchicago.edu, or (via the post) at:
  497. X
  498. X    5410 S. Ridgewood Ct., 2E
  499. X    Chicago, IL   60615
  500. X
  501. X
  502. X6.__Bibliography
  503. X
  504. X1.  Aho, Alfred V., Sethi, Ravi, and Ullman, Jeffrey D.  Compilers.
  505. X    Addison-Wesley: Reading, Massachusetts, second printing, 1988.
  506. X
  507. X2.  Griswold, Ralph E. and Griswold, Madge T.  The Icon Programming
  508. X    Language. Prentice-Hall, Inc.: Englewood Cliffs, New Jersey, USA,
  509. X    second edition, 1990.
  510. X
  511. X3.  Griswold, Ralph E., Jeffery, Clinton L., and Townsend, Gregg M.
  512. X    Version 8.10 of the Icon Programming Language.  Univ. of Arizona
  513. X    Icon Project Document 212, 1993.  (obtain via anonymous FTP from
  514. X    cs.arizona.edu ~ftp/icon/docs/ipd212.doc)
  515. X
  516. X4.  Tomita, Masaru.  Efficient Parsing for Natural Language.  Boston:
  517. X    Kluwer Academic Publishers, c. 1985.
  518. X
  519. X5.  Tomita, Masaru editor.  Generalized LR Parsing.  Boston:  Kluwer
  520. X    Academic Publishers, 1991.
  521. SHAR_EOF
  522. chmod 0444 README || echo "restore of README fails"
  523. rm -f s2_seq_.tmp
  524. echo "You have unpacked the last part"
  525. exit 0
  526. -- 
  527.  
  528.    -Richard L. Goerwitz              goer%midway@uchicago.bitnet
  529.    goer@midway.uchicago.edu          rutgers!oddjob!ellis!goer
  530.