home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / unix / volume6 / yaccref2 < prev    next >
Text File  |  1986-11-30  |  13KB  |  653 lines

  1. /* Written 10:09 pm  Jul 13, 1986 by cathy@comp.lancs.ac.uk in mirror:net.sources */
  2.  
  3.     ( Apologies for sending the wrong version here and to mod.sources a
  4.     few days ago. Correct version is listed below. All flames to above
  5.     address. )
  6.  
  7.     The following source forms the xref program for syntactically correct
  8. Yacc files and runs on UN*X 4.2. All tokens and non-terminals in the grammar
  9. are located, together with a list of the line numbers at which they occur. The
  10. output is a numbered listing of the Yacc grammar upto the second '%%' or EOF,
  11. followed by an alphabetical listing of the xref table.
  12.     Should a syntax error occur before normal termination, the grammar
  13. listing ends and as much of the table as has been constructed is printed. All
  14. comments /* .. */ , %{ .. %} and actions { .. } are ignored, although they
  15. appear in the listing. Overflow in any field of the data structure holding the
  16. table information is reported as it occurs and execution terminates without
  17. printing any xref information.
  18.     Table data is stored in "table[]", which holds MAXINTS terminal/non-
  19. terminal names, each of length <= MAXCHARS. A total of MAXDEFS defining (rhs of
  20. rule) occurances can be held, and a total of MAXOCCS lhs occurances. Each ident-
  21. ifier which may be the start token has the message held in "start_maybe[]"
  22. printed - likewise all possible tokens are accompanied by "token_maybe[]". All
  23. defining occurances are printed following "declared_at_mark[]", and all
  24. other occurances following "occurs_at_mark[]".
  25.     An example of the output is given below.
  26.  
  27.    1 :    %{
  28.    2 :    
  29.    3 :    
  30.    4 :    %}
  31.    5 :    
  32.    6 :        /*******************************************************\
  33.    7 :        *                            *
  34.    8 :        *    Trivial Yacc grammar.                *
  35.    9 :        *    ~~~~~~~~~~~~~~~~~~~~~                *
  36.   10 :        *                            *
  37.   11 :        \*******************************************************/
  38.   12 :    
  39.   13 :    %token    IDENTIFIER CHARACTER NUMBER
  40.   14 :    
  41.   15 :    %start    start
  42.   16 :    
  43.   17 :    %%
  44.   18 :    
  45.   19 :    start
  46.   20 :        :    begin middle end
  47.   21 :        ;
  48.   22 :    
  49.   23 :    begin
  50.   24 :        :    BEGIN
  51.   25 :        ;
  52.   26 :    
  53.   27 :    middle
  54.   28 :        :
  55.   29 :        ;
  56.   30 :    
  57.   31 :    begin
  58.   32 :        :
  59.   33 :        |    ALT_BEGIN
  60.   34 :        ;
  61.   35 :    
  62.   36 :    
  63.  
  64.  
  65. ' ALT_BEGIN ' -
  66.             is not declared - token?? 1 occurances at lines , 33
  67. ' BEGIN ' -
  68.             is not declared - token?? 1 occurances at lines , 24
  69. ' begin ' -
  70.             *23 , *31 1 occurances at lines , 20
  71. ' end ' -
  72.             is not declared - token?? 1 occurances at lines , 20
  73. ' middle ' -
  74.             *27  1 occurances at lines , 20
  75. ' start ' -
  76.             *19 , never occurs on rhs of rule - start rule?
  77.  
  78.     End of X-ref
  79.     ~~~~~~~~~~~~
  80.  
  81.     The text below should be stored in the file
  82.     
  83.     pack.out
  84.     
  85. and can be converted from the single file to the three files
  86.  
  87.     xref-grammar
  88.     xref-regular_expr
  89.     xref-line.h
  90.  
  91. by issuing the command
  92.  
  93.     sh pack.out
  94.  
  95.     Issue the commands
  96.  
  97.     lex xref-regular_expr
  98.     yacc -vd xref-grammar
  99.     cc y.tab.c -o xref
  100.  
  101. to produce an executable version and use as any UN*X command.
  102.  
  103.  
  104. <---------------------------------- Cut here ---------------------------------->
  105. #!/bin/sh
  106. echo 'Start of pack.out, part 01 of 01:'
  107. echo 'x - xref-grammar'
  108. sed 's/^X//' > xref-grammar << '/'
  109. X%{
  110. X
  111. X# include <ctype.h>
  112. X# include <stdio.h>
  113. X
  114. X
  115. X    /***************************************************************\
  116. X    *                                *
  117. X    *    Error messages.                        *
  118. X    *                                *
  119. X    \***************************************************************/
  120. X
  121. Xchar    *charroom = " MAXCHARS TOO SMALL - no room to store ";
  122. Xchar    *occroom  = " MAXOCCS TOO SMALL - no room to store occurance of ";
  123. Xchar    *defroom  = " MAXDEFS TOO SMALL - no room to store definition of ";
  124. Xchar    *idroom   = " MAXIDENTS TOO SMALL - no space in table for new identifier ";
  125. X
  126. X%}
  127. X
  128. X
  129. X    /*******************************************************\
  130. X    *                            *
  131. X    *    X_reference program for YACC files        *
  132. X    *    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~        *
  133. X    *                            *
  134. X    *    Cathy Taylor,                    *
  135. X    *    c/o Department of Computing,            *
  136. X    *    University of Lancaster,            *
  137. X    *    Bailrigg, Lancaster, England.            *
  138. X    *                            *
  139. X    *    Date : Mon Jul 14 01:24:34 BST 1986        *
  140. X    *                            *
  141. X    \*******************************************************/
  142. X
  143. X
  144. X    /***********************************************\
  145. X    *                        *
  146. X    *    Yacc Input Syntax            *
  147. X    *    ~~~~~~~~~~~~~~~~~            *
  148. X    *                        *
  149. X    *    Adapted from the document        *
  150. X    *    'YACC - Yet Another Compiler Compiler'    *
  151. X    *        by                *
  152. X    *       S. C. Johnson            *
  153. X    *                        *
  154. X    *    Date: Tue Jul  1 02:40:18 BST 1986    *
  155. X    *                        *
  156. X    \***********************************************/
  157. X
  158. X
  159. X%token    IDENTIFIER CHARACTER NUMBER
  160. X%token    LEFT RIGHT NONASSOC TOKEN PREC TYPE START UNION
  161. X%token    PER PERCURL ACT
  162. X%token    COLON SEMICOLON COMMA OR LESS GREATER
  163. X
  164. X%start    spec
  165. X
  166. X%%
  167. X
  168. Xspec
  169. X    :    defs PER rules tail
  170. X            {
  171. X                printf("\n\n");
  172. X                yyclearin;
  173. X                return(0);
  174. X            }
  175. X    ;
  176. X
  177. Xtail
  178. X    :    /* empty */
  179. X    |    PER 
  180. X    ;
  181. X
  182. Xdefs
  183. X    :    /* empty */
  184. X    |    def_bk
  185. X    ;
  186. X
  187. Xdef_bk
  188. X    :    def
  189. X    |    def_bk def
  190. X    ;
  191. X
  192. Xdef
  193. X    :    START IDENTIFIER
  194. X    |    UNION
  195. X    |    PERCURL
  196. X    |    rword tag nlist
  197. X    ;
  198. X
  199. Xrword
  200. X    :    TOKEN
  201. X    |    LEFT
  202. X    |    RIGHT
  203. X    |    NONASSOC
  204. X    |    TYPE
  205. X    ;
  206. X
  207. Xtag
  208. X    :    /* empty */
  209. X    |    LESS IDENTIFIER GREATER
  210. X    ;
  211. X
  212. Xnlist
  213. X    :    nmno
  214. X    |    nlist opt_comma nmno
  215. X    ;
  216. X
  217. Xopt_comma
  218. X    :    /* empty */
  219. X    |    COMMA
  220. X    ;
  221. X
  222. Xnmno
  223. X    :    IDENTIFIER opt_num
  224. X    ;
  225. X
  226. Xopt_num
  227. X    :    /* empty */
  228. X    |    NUMBER
  229. X    ;
  230. Xrules
  231. X    :    rule
  232. X    |    rules rule
  233. X    ;
  234. X
  235. Xrule
  236. X    :    IDENTIFIER
  237. X        {
  238. X            yyaction(ON_C_IDENT,line);
  239. X        }
  240. X        COLON body SEMICOLON
  241. X    ;
  242. X
  243. Xbody
  244. X    :    body_block
  245. X    |    body OR body_block
  246. X    ;
  247. X
  248. Xbody_block
  249. X    :    /* empty */
  250. X    |    body_block body_entity
  251. X    ;
  252. X
  253. Xbody_entity
  254. X    :    opt_prec id_ent
  255. X    |    ACT
  256. X    ;
  257. X
  258. Xid_ent
  259. X    :    IDENTIFIER
  260. X        {
  261. X            yyaction(ON_IDENT,line);
  262. X        }
  263. X    |    CHARACTER
  264. X    ;
  265. X
  266. Xopt_prec
  267. X    :    /* empty */
  268. X    |    PREC
  269. X    ;
  270. X
  271. X
  272. X%%
  273. X
  274. X# include    <stdio.h>
  275. X# include    "lex.yy.c"
  276. X# include    "sto.h"
  277. X
  278. X#define    ON_C_IDENT    000
  279. X#define    ON_IDENT    001
  280. X
  281. X#define    MAXIDENTS    200
  282. X#define    MAXCHARS    50
  283. X#define    MAXDEFS        5
  284. X#define    MAXOCCS        80
  285. X
  286. Xstruct    IREC {
  287. X        char    symbol[MAXCHARS];
  288. X        int    description[MAXDEFS];
  289. X        int    next_d;
  290. X        int    occurance[MAXOCCS];
  291. X        int    next_o;
  292. X        } table[MAXIDENTS];
  293. X
  294. X
  295. Xyyaction (action,ln)
  296. Xint    action;
  297. Xint    ln;
  298. X{
  299. X    int    id;
  300. X    
  301. X    id = 0;
  302. X    while (    strcmp(table[id].symbol,yytext) != 0 && strcmp(table[id].symbol,"") != 0 )
  303. X    {
  304. X        if (id== MAXIDENTS)
  305. X        {
  306. X            yyerror(strcat(idroom,yytext),ln);
  307. X            exit(3);
  308. X        }
  309. X        id++;
  310. X    }
  311. X
  312. X    if ( strcmp(table[id].symbol, yytext) != 0 )
  313. X    {
  314. X
  315. X    /*******************************************************\
  316. X    *                            *
  317. X    *    New non-terminal to be stored.            *
  318. X    *    No distinction is made here between tokens    *
  319. X    *    and (non) terminals.                *
  320. X    *                            *
  321. X    \*******************************************************/
  322. X
  323. X        if (strlen(yytext) == MAXCHARS)
  324. X        {
  325. X            yyerror(strcat(charroom,yytext),ln);
  326. X            exit(3);
  327. X        } /* fi */
  328. X        strcpy(table[id].symbol,yytext);
  329. X        table[id].next_d = 0;
  330. X        table[id].next_o = 0;
  331. X    } /* fi */
  332. X
  333. X    switch (action) {
  334. X    case ON_C_IDENT:
  335. X
  336. X    /*******************************************************\
  337. X    *                            *
  338. X    *    Add to list of definition lines.        *
  339. X    *                            *
  340. X    \*******************************************************/
  341. X
  342. X        if (table[id].next_d == MAXDEFS )
  343. X        {
  344. X            yyerror(strcat(defroom,yytext),ln);
  345. X            exit(3);
  346. X        } /* fi */
  347. X        table[id].description[table[id].next_d++] = ln;
  348. X        break;
  349. X
  350. X
  351. X    case ON_IDENT:
  352. X                
  353. X    /*******************************************************\
  354. X    *                            *
  355. X    *    Add to list of occurance lines.            *
  356. X    *                            *
  357. X    \*******************************************************/
  358. X        if (table[id].next_o == MAXOCCS )
  359. X        {
  360. X            yyerror(strcat(occroom,yytext),ln);
  361. X            exit(3);
  362. X        } /* fi */
  363. X        table[id].occurance[table[id].next_o++] = ln;
  364. X        break;
  365. X
  366. X    default        :
  367. X        fprintf (stdout, "yyaction: invalid action\n");
  368. X        return (-1);
  369. X        } /* hctiws */
  370. X    return (0);
  371. X} /* corp */
  372. X
  373. Xnline(ln)
  374. Xint    ln;
  375. X{
  376. X    printf("%4d :\t",ln);
  377. X}
  378. X
  379. X
  380. X    char    declared_at_mark[] = "*";
  381. X    char    occurs_at_mark[] = "";
  382. X    char    token_maybe[] = "is not declared - token??";
  383. X    char    start_maybe[] = "never occurs on rhs of rule - start rule?";
  384. X    
  385. X/*
  386. X*    Strings for output
  387. X*/
  388. X
  389. Xmain ()
  390. X{
  391. X    int    ind,id,numids;
  392. X    int    i, j, gap, temp;
  393. X    int    pos[MAXIDENTS];
  394. X
  395. X    strcpy(table[0].symbol,"");
  396. X
  397. X    line = 0;
  398. X    nline(++line);
  399. X
  400. X    yyparse ();
  401. X
  402. X    id = 0;
  403. X    while ( strcmp(table[id].symbol,"") != 0 )
  404. X        pos[id] = id++;
  405. X    
  406. X
  407. X    /***************************************************************\
  408. X    *                                *
  409. X    *    Grubby sort. Pointers to records held in "pos[]".    *
  410. X    *                                *
  411. X    \***************************************************************/
  412. X
  413. X    numids = id;
  414. X    for (gap = numids/2; gap > 0; gap /= 2)
  415. X        for (i=gap; i<numids; i++)
  416. X            for (j=i-gap; j>=0; j-=gap)
  417. X                if (strcmp(table[pos[j]].symbol,table[pos[j+gap]].symbol) > 0)
  418. X                {
  419. X                    temp = pos[j];
  420. X                    pos[j] = pos[j+gap];
  421. X                    pos[j+gap] = temp;
  422. X                }
  423. X    
  424. X
  425. X    for ( i=0; i<numids; i++ )
  426. X    {
  427. X        id = pos[i];
  428. X        printf("\n' %s ' -\n\t\t\t",table[id].symbol);
  429. X        if (table[id].next_d == 0 )
  430. X            printf("%s",token_maybe);
  431. X        else
  432. X        {
  433. X            ind = 0;
  434. X            printf("%s%d ",declared_at_mark,table[id].description[ind++]);
  435. X            for ( ind=1; ind < table[id].next_d ; ind++)
  436. X            printf(", %s%d",declared_at_mark,table[id].description[ind]);
  437. X        }
  438. X        if (table[id].occurance[0] == 0)
  439. X            printf(", %s",start_maybe);
  440. X        else
  441. X        {
  442. X            printf(" %d occurances at lines ",table[id].next_o);
  443. X            for ( ind = 0; ind < table[id].next_o ; ind++ )
  444. X            printf(", %s%d",occurs_at_mark,table[id].occurance[ind]);
  445. X        }
  446. X        id++;
  447. X    }
  448. X    printf("\n\n\tEnd of X-ref\n\t~~~~~~~~~~~~\n");
  449. X} /* niam */
  450. X
  451. Xyyerror(mess,errline)
  452. Xchar    *mess;
  453. X{
  454. X    printf("\n\n\n\t%s at line %d\n",mess,errline);
  455. X} /* corp */
  456. /
  457. echo 'x - xref-regular_expr'
  458. sed 's/^X//' > xref-regular_expr << '/'
  459. X
  460. X    /*******************************************************\
  461. X    *                            *
  462. X    *    X_ref for YACC - LEX file            *
  463. X    *    ~~~~~~~~~~~~~~~~~~~~~~~~~            *
  464. X    *                            *
  465. X    *    Date: Tue Jul  1 03:36:21 BST 1986        *
  466. X    *                            *
  467. X    \*******************************************************/
  468. X
  469. X%{
  470. X
  471. X# include    <stdio.h>
  472. X# include    "sto.h"
  473. X
  474. X#define        TRUE 1
  475. X#define     FALSE 0
  476. X
  477. Xint    recognised;
  478. Xchar    c;
  479. X
  480. X%}
  481. X
  482. X    /* abbreviations */
  483. X
  484. Xdigit        [0-9]
  485. Xu_case        [A-Z]
  486. Xl_case        [a-z]
  487. Xid_char        [A-Za-z0-9_]
  488. Xletter        [A-Za-z]
  489. Xwhite        [\t ]
  490. X
  491. X
  492. X%%
  493. X
  494. X"/*"            {
  495. X                ECHO;
  496. X                recognised = FALSE;
  497. X                c = nextchar();
  498. X                while (recognised == FALSE)
  499. X                {
  500. X                    while (c != '*')
  501. X                        c = nextchar();
  502. X                    c = nextchar();
  503. X                    if (c == '\/')
  504. X                        recognised = TRUE;
  505. X                }
  506. X            }
  507. X"%{"            {
  508. X                ECHO;
  509. X                recognised = FALSE;
  510. X                c = nextchar();
  511. X                while (recognised == FALSE)
  512. X                {
  513. X                    while (c != '\%')
  514. X                        c = nextchar();
  515. X                    c = nextchar();
  516. X                    if (c == '\}')
  517. X                        recognised = TRUE;
  518. X                }
  519. X                return(PERCURL);
  520. X            }
  521. X"{"            {
  522. X
  523. X/*
  524. X*    Although LEX can cope with the full definition,
  525. X*    ( "{"[^\}]*"}" ) this may overrun the lex buffer (200 chars).
  526. X*    Thus this routine.
  527. X*/
  528. X
  529. X                ECHO;
  530. X                c = nextchar();
  531. X                while (c != '\}')
  532. X                    c = nextchar();
  533. X                return(ACT);
  534. X            }
  535. X{letter}{id_char}*    {
  536. X                ECHO;
  537. X                return(IDENTIFIER);
  538. X            }
  539. X"'"\\?[^']+"'"        {
  540. X                ECHO;
  541. X                return(CHARACTER);
  542. X            }
  543. X{white}+        {    
  544. X                ECHO;
  545. X            }
  546. X{digit}+        {
  547. X                ECHO;
  548. X                return(NUMBER);
  549. X            }
  550. X"%"{white}*"left"    {
  551. X                ECHO;
  552. X                return(LEFT);
  553. X            }
  554. X"%"{white}*"right"    {
  555. X                ECHO;
  556. X                return(RIGHT);
  557. X            }
  558. X"%"{white}*"nonassoc"    {
  559. X                ECHO;
  560. X                return(NONASSOC);
  561. X            }
  562. X"%"{white}*"token"    {
  563. X                ECHO;
  564. X                return(TOKEN);
  565. X            }
  566. X"%"{white}*"prec"    {
  567. X                ECHO;
  568. X                return(PREC);
  569. X            }
  570. X"%"{white}*"type"    {
  571. X                ECHO;
  572. X                return(TYPE);
  573. X            }
  574. X"%"{white}*"start"    {
  575. X                ECHO;
  576. X                return(START);
  577. X            }
  578. X"%"{white}*"union"    {
  579. X                ECHO;
  580. X                return(UNION);
  581. X            }
  582. X"%%"            {
  583. X                ECHO;
  584. X                return(PER);
  585. X            }
  586. X":"            {
  587. X                ECHO;
  588. X                return(COLON);
  589. X            }
  590. X";"            {
  591. X                ECHO;
  592. X                return(SEMICOLON);
  593. X            }
  594. X","            {
  595. X                ECHO;
  596. X                return(COMMA);
  597. X            }
  598. X"|"            {
  599. X                ECHO;
  600. X                return(OR);
  601. X            }
  602. X"<"            {
  603. X                ECHO;
  604. X                return(LESS);
  605. X            }
  606. X">"            {
  607. X                ECHO;
  608. X                return(GREATER);
  609. X            }
  610. X"\n"            {
  611. X                ECHO;
  612. X                nline(++line);
  613. X            }
  614. X
  615. X%%
  616. X
  617. Xyywrap()
  618. X{
  619. X    /* wrap-up procedure */
  620. X    return(1);
  621. X}
  622. X
  623. Xnextchar()
  624. X{
  625. X    char    c;
  626. X    
  627. X    c = input();
  628. X    printf("%c",c);
  629. X    if (c == '\n')
  630. X        nline(++line);
  631. X    return(c);
  632. X}
  633. /
  634. echo 'x - xref-line.h'
  635. sed 's/^X//' > xref-line.h << '/'
  636. X
  637. X    int    line;
  638. /
  639. echo 'Part 01 of pack.out complete.'
  640. exit
  641. <---------------------------------- Cut here ---------------------------------->
  642. -- 
  643.  
  644.      - Marxist unite!
  645.      - Comrades unite!
  646.      - Bad-spellers of the world untie!
  647.   
  648. UUCP:  ...!seismo!mcvax!ukc!dcl-cs!cathy
  649. DARPA: cathy%lancs.comp@ucl-cs    | Post: University of Lancaster,
  650. JANET: cathy@uk.ac.lancs.comp    |    Department of Computing,
  651. Phone: +44 524 65201 ext ????    |    Bailrigg, Lancaster, LA1 4YR, UK.
  652. /* End of text from mirror:net.sources */
  653.