123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416 |
- /* SPARSE- START OF PARSE */
- /*COPYRIGHT 1980, INFOCOM COMPUTERS AND COMMUNICATIONS, CAMBRIDGE MA. 02142*/
- /* ALL RIGHTS RESERVED, COMMERCIAL USAGE STRICTLY PROHIBITED */
- /* WRITTEN BY R. M. SUPNIK */
- #include "funcs.h"
- #include "vars.h"
- #undef EXTERN
- #define EXTERN
- #define INIT
- #include "parse.h"
- /* THIS ROUTINE DETAILS ON BIT 2 OF PRSFLG */
- integer sparse_(lbuf, llnt, vbflag)
- const integer *lbuf;
- integer llnt;
- logical vbflag;
- {
- /* Initialized data */
- /* DATA R50MIN/1RA/,R50WAL/3RWAL/ */
- const integer r50min = 1600;
- const integer r50wal = 36852;
- /* System generated locals */
- volatile integer ret_val, i__1, i__2;
- /* Local variables */
- integer i, j, adj;
- integer obj;
- integer prep, pptr, lbuf1, lbuf2;
- integer buzlnt, prplnt, dirlnt;
- /* Parameter adjustments */
- --lbuf;
- /* Function Body */
- /* SET UP FOR PARSING */
- ret_val = -1;
- /* !ASSUME PARSE FAILS. */
- adj = 0;
- /* !CLEAR PARTS HOLDERS. */
- pv_1.act = 0;
- prep = 0;
- pptr = 0;
- pv_1.o1 = 0;
- pv_1.o2 = 0;
- pv_1.p1 = 0;
- pv_1.p2 = 0;
- buzlnt = 20;
- prplnt = 48;
- dirlnt = 75;
- /* SPARSE, PAGE 8 */
- /* NOW LOOP OVER INPUT BUFFER OF LEXICAL TOKENS. */
- i__1 = llnt;
- for (i = 1; i <= i__1; i += 2) {
- /* !TWO WORDS/TOKEN. */
- lbuf1 = lbuf[i];
- /* !GET CURRENT TOKEN. */
- lbuf2 = lbuf[i + 1];
- if (lbuf1 == 0) {
- goto L1500;
- }
- /* !END OF BUFFER? */
- /* CHECK FOR BUZZ WORD */
- i__2 = buzlnt;
- for (j = 1; j <= i__2; j += 2) {
- if (lbuf1 == buzvoc_1.bvoc[j - 1] && lbuf2 == buzvoc_1.bvoc[j]) {
- goto L1000;
- }
- /* L50: */
- }
- /* CHECK FOR ACTION OR DIRECTION */
- if (pv_1.act != 0) {
- goto L75;
- }
- /* !GOT ACTION ALREADY? */
- j = 1;
- /* !CHECK FOR ACTION. */
- L125:
- if (lbuf1 == vvoc[j - 1] && lbuf2 == vvoc[j]) {
- goto L3000;
- }
- /* L150: */
- j += 2;
- /* !ADV TO NEXT SYNONYM. */
- if (! (vvoc[j - 1] > 0 && vvoc[j - 1] < r50min)) {
- goto L125;
- }
- /* !ANOTHER VERB? */
- j = j + vvoc[j - 1] + 1;
- /* !NO, ADVANCE OVER SYNTAX. */
- if (vvoc[j - 1] != -1) {
- goto L125;
- }
- /* !TABLE DONE? */
- L75:
- if (pv_1.act != 0 && (vvoc[pv_1.act - 1] != r50wal || prep != 0)) {
- goto L200;
- }
- i__2 = dirlnt;
- for (j = 1; j <= i__2; j += 3) {
- /* !THEN CHK FOR DIR. */
- if (lbuf1 == dirvoc_1.dvoc[j - 1] && lbuf2 == dirvoc_1.dvoc[j]) {
- goto L2000;
- }
- /* L100: */
- }
- /* NOT AN ACTION, CHECK FOR PREPOSITION, ADJECTIVE, OR OBJECT. */
- L200:
- i__2 = prplnt;
- for (j = 1; j <= i__2; j += 3) {
- /* !LOOK FOR PREPOSITION. */
- if (lbuf1 == prpvoc_1.pvoc[j - 1] && lbuf2 == prpvoc_1.pvoc[j]) {
- goto L4000;
- }
- /* L250: */
- }
- j = 1;
- /* !LOOK FOR ADJECTIVE. */
- L300:
- if (lbuf1 == avoc[j - 1] && lbuf2 == avoc[j]) {
- goto L5000;
- }
- ++j;
- L325:
- ++j;
- /* !ADVANCE TO NEXT ENTRY. */
- if (avoc[j - 1] > 0 && avoc[j - 1] < r50min) {
- goto L325;
- }
- /* !A RADIX 50 CONSTANT? */
- if (avoc[j - 1] != -1) {
- goto L300;
- }
- /* !POSSIBLY, END TABLE? */
- j = 1;
- /* !LOOK FOR OBJECT. */
- L450:
- if (lbuf1 == ovoc[j - 1] && lbuf2 == ovoc[j]) {
- goto L600;
- }
- ++j;
- L500:
- ++j;
- if (ovoc[j - 1] > 0 && ovoc[j - 1] < r50min) {
- goto L500;
- }
- if (ovoc[j - 1] != -1) {
- goto L450;
- }
- /* NOT RECOGNIZABLE */
- if (vbflag) {
- rspeak_(601);
- }
- return ret_val;
- /* SPARSE, PAGE 9 */
- /* OBJECT PROCESSING (CONTINUATION OF DO LOOP ON PREV PAGE) */
- L600:
- obj = getobj_(j, adj, 0);
- /* !IDENTIFY OBJECT. */
- if (obj <= 0) {
- goto L6000;
- }
- /* !IF LE, COULDNT. */
- if (obj != oindex_1.itobj) {
- goto L650;
- }
- /* !"IT"? */
- obj = getobj_(0, 0, last_1.lastit);
- /* !FIND LAST. */
- if (obj <= 0) {
- goto L6000;
- }
- /* !IF LE, COULDNT. */
- L650:
- if (prep == 9) {
- goto L8000;
- }
- /* !"OF" OBJ? */
- if (pptr == 2) {
- goto L7000;
- }
- /* !TOO MANY OBJS? */
- ++pptr;
- objvec[pptr - 1] = obj;
- /* !STUFF INTO VECTOR. */
- prpvec[pptr - 1] = prep;
- L700:
- prep = 0;
- adj = 0;
- /* Go to end of do loop (moved "1000 CONTINUE" to end of module, to av
- oid */
- /* complaints about people jumping back into the doloop.) */
- goto L1000;
- /* SPARSE, PAGE 10 */
- /* SPECIAL PARSE PROCESSORS */
- /* 2000-- DIRECTION */
- L2000:
- prsvec_1.prsa = vindex_1.walkw;
- prsvec_1.prso = dirvoc_1.dvoc[j + 1];
- ret_val = 1;
- return ret_val;
- /* 3000-- ACTION */
- L3000:
- pv_1.act = j;
- orphs_1.oact = 0;
- goto L1000;
- /* 4000-- PREPOSITION */
- L4000:
- if (prep != 0) {
- goto L4500;
- }
- prep = prpvoc_1.pvoc[j + 1];
- adj = 0;
- goto L1000;
- L4500:
- if (vbflag) {
- rspeak_(616);
- }
- return ret_val;
- /* 5000-- ADJECTIVE */
- L5000:
- adj = j;
- j = orphs_1.oname & orphs_1.oflag;
- if (j != 0 && i >= llnt) {
- goto L600;
- }
- goto L1000;
- /* 6000-- UNIDENTIFIABLE OBJECT (INDEX INTO OVOC IS J) */
- L6000:
- if (obj < 0) {
- goto L6100;
- }
- j = 579;
- if (lit_(play_1.here)) {
- j = 618;
- }
- if (vbflag) {
- rspeak_(j);
- }
- return ret_val;
- L6100:
- if (obj != -10000) {
- goto L6200;
- }
- if (vbflag) {
- rspsub_(620, objcts_1.odesc2[advs_1.avehic[play_1.winner - 1]
- - 1]);
- }
- return ret_val;
- L6200:
- if (vbflag) {
- rspeak_(619);
- }
- if (pv_1.act == 0) {
- pv_1.act = orphs_1.oflag & orphs_1.oact;
- }
- orphan_(- 1, pv_1.act, pv_1.o1, prep, j);
- return ret_val;
- /* 7000-- TOO MANY OBJECTS. */
- L7000:
- if (vbflag) {
- rspeak_(617);
- }
- return ret_val;
- /* 8000-- RANDOMNESS FOR "OF" WORDS */
- L8000:
- if (objvec[pptr - 1] == obj) {
- goto L700;
- }
- if (vbflag) {
- rspeak_(601);
- }
- return ret_val;
- /* End of do-loop. */
- L1000:
- ;
- }
- /* !AT LAST. */
- /* NOW SOME MISC CLEANUP -- We fell out of the do-loop */
- L1500:
- if (pv_1.act == 0) {
- pv_1.act = orphs_1.oflag & orphs_1.oact;
- }
- if (pv_1.act == 0) {
- goto L9000;
- }
- /* !IF STILL NONE, PUNT. */
- if (adj != 0) {
- goto L10000;
- }
- /* !IF DANGLING ADJ, PUNT. */
- if (orphs_1.oflag != 0 && orphs_1.oprep != 0 && prep == 0 && pv_1.o1 != 0
- && pv_1.o2 == 0 && pv_1.act == orphs_1.oact) {
- goto L11000;
- }
- ret_val = 0;
- /* !PARSE SUCCEEDS. */
- if (prep == 0) {
- goto L1750;
- }
- /* !IF DANGLING PREP, */
- if (pptr == 0 || prpvec[pptr - 1] != 0) {
- goto L12000;
- }
- prpvec[pptr - 1] = prep;
- /* !CVT TO 'PICK UP FROB'. */
- /* 1750-- RETURN A RESULT */
- L1750:
- /* !WIN. */
- return ret_val;
- /* !LOSE. */
- /* 9000-- NO ACTION, PUNT */
- L9000:
- if (pv_1.o1 == 0) {
- goto L10000;
- }
- /* !ANY DIRECT OBJECT? */
- if (vbflag) {
- rspsub_(621, objcts_1.odesc2[pv_1.o1 - 1]);
- }
- /* !WHAT TO DO? */
- orphan_(- 1, 0, pv_1.o1, 0, 0);
- return ret_val;
- /* 10000-- TOTAL CHOMP */
- L10000:
- if (vbflag) {
- rspeak_(622);
- }
- /* !HUH? */
- return ret_val;
- /* 11000-- ORPHAN PREPOSITION. CONDITIONS ARE */
- /* O1.NE.0, O2=0, PREP=0, ACT=OACT */
- L11000:
- if (orphs_1.oslot != 0) {
- goto L11500;
- }
- /* !ORPHAN OBJECT? */
- pv_1.p1 = orphs_1.oprep;
- /* !NO, JUST USE PREP. */
- goto L1750;
- L11500:
- pv_1.o2 = pv_1.o1;
- /* !YES, USE AS DIRECT OBJ. */
- pv_1.p2 = orphs_1.oprep;
- pv_1.o1 = orphs_1.oslot;
- pv_1.p1 = 0;
- goto L1750;
- /* 12000-- TRUE HANGING PREPOSITION. */
- /* ORPHAN FOR LATER. */
- L12000:
- orphan_(- 1, pv_1.act, 0, prep, 0);
- /* !ORPHAN PREP. */
- goto L1750;
- } /* sparse_ */
|