Xref again (yawn)
Cathy
cathy at comp.lancs.ac.uk
Tue Oct 28 23:57:51 AEST 1986
Due to the large number of flames concerning the xref bugs in "union"
statements, here is a version which caters for them. All "{" "}" inside
print statements in actions are also handled. Many thanks to all flamers
especially: "Robert O. Domitz" <rod at uucp.pecnos> for his patience.
<-----------------------------CUT HERE----------------------------------------->
#!/bin/sh
echo 'Start of pack.out, part 01 of 01:'
echo 'x - xref.lex'
sed 's/^X//' > xref.lex << '/'
X
X /*******************************************************\
X * *
X * X_ref for YACC - LEX file *
X * ~~~~~~~~~~~~~~~~~~~~~~~~~ *
X * *
X * Date: Sat Sep 13 19:13:12 BST 1986 *
X * Cathy Taylor, *
X * c/o Department of Computing, *
X * University of Lancaster, *
X * Bailrigg, Lancaster, England. *
X * *
X \*******************************************************/
X
X%{
X# include <stdio.h>
X# include "xref.line.h"
X# define TRUE 1
X# define FALSE 0
X
Xint recognised,depth,quoted;
Xchar c,oldc;
X%}
X
X /* abbreviations */
X
Xdigit [0-9]
Xu_case [A-Z]
Xl_case [a-z]
Xid_char [A-Za-z0-9_.]
Xletter [A-Za-z]
Xwhite [\t ]
X
X%%
X
X"/*" {
X ECHO;
X recognised = FALSE;
X c = nextc();
X while (recognised == FALSE)
X {
X while (c != '*')
X c = nextc();
X c = nextc();
X if (c == '\/')
X recognised = TRUE;
X }
X }
X"%{" {
X ECHO;
X recognised = FALSE;
X c = nextc();
X while (recognised == FALSE)
X {
X while (c != '\%')
X c = nextc();
X c = nextc();
X if (c == '\}')
X recognised = TRUE;
X }
X return(PERCURL);
X }
X"{" {
X
X/*
X* This definition handles nested {} and braces inside print statements.
X*/
X
X ECHO;
X depth=1;
X oldc = '\0';
X quoted = FALSE;
X while (depth != 0)
X {
X c = nextc();
X while (c != '\}')
X {
X if (( c == '\{' ) && (quoted == FALSE) && (oldc != '\\'))
X depth++;
X if ((c == '\"') && (oldc != '\\'))
X quoted = (quoted+1) % 2;
X oldc = c;
X c = nextc();
X }
X oldc = c;
X if ((quoted == FALSE) && (oldc != '\\'))
X depth--;
X }
X return(ACT);
X }
X{letter}{id_char}* {
X ECHO;
X return(IDENTIFIER);
X }
X"'"\\?[^']+"'" {
X ECHO;
X return(CHARACTER);
X }
X{white}+ {
X ECHO;
X }
X{digit}+ {
X ECHO;
X return(NUMBER);
X }
X"%"{white}*"left" {
X ECHO;
X return(LEFT);
X }
X"%"{white}*"right" {
X ECHO;
X return(RIGHT);
X }
X"%"{white}*"nonassoc" {
X ECHO;
X return(NONASSOC);
X }
X"%"{white}*"token" {
X ECHO;
X return(TOKEN);
X }
X"%"{white}*"prec" {
X ECHO;
X return(PREC);
X }
X"%"{white}*"type" {
X ECHO;
X return(TYPE);
X }
X"%"{white}*"start" {
X ECHO;
X return(START);
X }
X"%"{white}*"union" {
X ECHO;
X return(UNION);
X }
X"%%" {
X ECHO;
X return(PER);
X }
X":" {
X ECHO;
X return(COLON);
X }
X";" {
X ECHO;
X return(SEMICOLON);
X }
X"," {
X ECHO;
X return(COMMA);
X }
X"|" {
X ECHO;
X return(OR);
X }
X"<" {
X ECHO;
X return(LESS);
X }
X">" {
X ECHO;
X return(GREATER);
X }
X"\n" {
X ECHO;
X nline(++line);
X }
X
X%%
X
Xyywrap()
X{
X /* wrap-up procedure */
X return(1);
X}
X
Xnextc()
X{
X char c;
X
X c = input();
X printf("%c",c);
X if (c == '\n')
X nline(++line);
X return(c);
X}
/
echo 'x - xref.line.h'
sed 's/^X//' > xref.line.h << '/'
X
X int line;
X
/
echo 'x - xref.yacc'
sed 's/^X//' > xref.yacc << '/'
X%{
X# include <ctype.h>
X# include <stdio.h>
X%}
X
X /*******************************************************\
X * *
X * X_reference program for YACC files *
X * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ *
X * Cathy Taylor, *
X * c/o Department of Computing, *
X * University of Lancaster, *
X * Bailrigg, Lancaster, England. *
X * *
X * Date : Sat Sep 13 19:14:26 BST 1986 *
X * *
X \*******************************************************/
X
X /***********************************************\
X * *
X * Yacc Input Syntax *
X * ~~~~~~~~~~~~~~~~~ *
X * Adapted from the document *
X * 'YACC - Yet Another Compiler Compiler' *
X * by *
X * S. C. Johnson *
X * ************* *
X * *
X * Date: Tue Jul 1 02:40:18 BST 1986 *
X * *
X \***********************************************/
X
X%token IDENTIFIER CHARACTER NUMBER PER PERCURL ACT
X%token LEFT RIGHT NONASSOC TOKEN PREC TYPE START UNION
X%token COLON SEMICOLON COMMA OR LESS GREATER
X
X%start spec
X
X%%
X
Xspec
X : defs PER rules tail
X {
X printf("\n\n");
X yyclearin;
X return(0);
X }
X ;
X
Xtail
X : /* empty */
X | PER
X ;
X
Xdefs
X : /* empty */
X | def_bk
X ;
X
Xdef_bk
X : def
X | def_bk def
X ;
X
Xdef
X : START IDENTIFIER
X | UNION ACT
X | PERCURL
X | rword tag nlist
X ;
X
Xrword
X : TOKEN
X | LEFT
X | RIGHT
X | NONASSOC
X | TYPE
X ;
X
Xtag
X : /* empty */
X | LESS IDENTIFIER GREATER
X ;
X
Xnlist
X : nmno
X | nlist opt_comma nmno
X ;
X
Xopt_comma
X : /* empty */
X | COMMA
X ;
X
Xnmno
X : IDENTIFIER opt_num
X ;
X
Xopt_num
X : /* empty */
X | NUMBER
X ;
Xrules
X : rule
X | rules rule
X ;
X
Xrule
X : IDENTIFIER
X {
X yyaction(ON_C_IDENT,line,yytext);
X }
X COLON body SEMICOLON
X ;
X
Xbody
X : body_block
X | body OR body_block
X ;
X
Xbody_block
X : /* empty */
X | body_block body_entity
X ;
X
Xbody_entity
X : opt_prec id_ent
X | ACT
X ;
X
Xid_ent
X : IDENTIFIER
X {
X yyaction(ON_IDENT,line,yytext);
X }
X | CHARACTER
X ;
X
Xopt_prec
X : /* empty */
X | PREC
X ;
X
X
X%%
X
X# include <stdio.h>
X# include "lex.yy.c"
X# include "xref.line.h"
X
X# define ON_C_IDENT 000
X# define ON_IDENT 001
X
Xstruct llist {
X int line;
X struct llist *next;
X } ;
X
Xstruct table {
X char *symbol;
X struct llist *desc;
X struct llist *occ;
X struct table *left;
X struct table *right;
X } *table = NULL;
X
Xextern char *malloc();
X
Xchar *nocore[] = "No more core left";
X
Xyyerror(mess)
Xchar *mess;
X{
X printf("\n\n\n\t%s\n");
X}
X
Xchar *m_alloc(nbytes)
Xunsigned nbytes;
X{
X char *p;
X
X if ((p=malloc(nbytes)) != NULL)
X return(p);
X yyerror(nocore);
X exit(3);
X}
X
Xstruct llist *save_ln(ln,ptr)
X int ln;
Xstruct llist *ptr;
X{
X struct llist *q;
X
X ptr -> line = ln;
X q = (struct llist *) m_alloc(sizeof(struct llist) + 1);
X q -> next = ptr;
X return(q);
X}
X
Xchar *strsave(s)
Xchar *s;
X{
X char *p;
X
X p = m_alloc(strlen(s)+1);
X strcpy(p,s);
X return(p);
X}
X
X char *mess = "Case bound error";
X
Xstruct table *save_symbol(action,ln,text,ptr)
X int action;
X int ln;
X char *text;
Xstruct table *ptr;
X{
X if (ptr == NULL) /* create new definition */
X {
X ptr = (struct table *) m_alloc(sizeof(struct table)+1);
X ptr -> symbol = strsave(text);
X ptr -> left = ptr -> right = NULL;
X ptr -> desc = (struct llist *) m_alloc(sizeof(struct llist)+1);
X ptr -> occ = (struct llist *) m_alloc(sizeof(struct llist)+1);
X }
X else if ((strcmp(ptr -> symbol,text)) < 0)
X {
X ptr -> left = save_symbol(action,ln,text,ptr -> left);
X return(ptr);
X }
X else if ((strcmp(ptr -> symbol,text)) > 0)
X {
X ptr -> right = save_symbol(action,ln,text,ptr -> right);
X return(ptr);
X }
X switch (action)
X { case ON_C_IDENT : /* Add to list of definition lines */
X {
X ptr -> desc = save_ln(ln,ptr -> desc);
X return(ptr);
X }
X case ON_IDENT : /* Add to list of occurance lines */
X {
X ptr -> occ = save_ln(ln,ptr -> occ);
X return(ptr);
X }
X default :
X {
X yyerror(mess);
X exit(3);
X }
X }
X}
X
Xyyaction (action,ln,text)
X int action;
X int ln;
X char *text;
X{
X table = save_symbol(action,ln,text,table);
X}
X
Xlist_lines(ptr,comment)
Xstruct llist *ptr;
X char *comment;
X{
X fprintf(stdout,"%s%d",comment,ptr -> line);
X if (ptr -> next == NULL)
X {
X fprintf(stdout," ; ");
X return(0);
X }
X fprintf(stdout,", ");
X list_lines(ptr -> next,comment);
X}
X
X/*******************************\
X* *
X* Fprint strings. *
X* *
X\*******************************/
X
X char pre_decl_list_mark[] = "";
X char pre_occ_list_mark[] = " occurs at line(s) ";
X char declared_at_mark[] = "*";
X char occurs_at_mark[] = "";
X char token_maybe[] = "is not declared - token?? ";
X char start_maybe[] = "never occurs on rhs of rule - start rule? ";
X
Xlist_xref(root)
Xstruct table *root;
X{
X if (root == NULL)
X return(0);
X list_xref(root -> right);
X/*
X* List info for current string.
X*/
X {
X fprintf(stdout,"\n' %s ' -\n\t\t\t",root -> symbol);
X if (root -> desc -> next == NULL)
X fprintf(stdout,"%s",token_maybe);
X else
X list_lines(root -> desc -> next,declared_at_mark);
X if (root -> occ -> next == NULL)
X fprintf(stdout,", %s",start_maybe);
X else
X {
X fprintf(stdout,"%s",pre_occ_list_mark);
X list_lines(root -> occ -> next,occurs_at_mark);
X }
X }
X
X list_xref(root -> left);
X}
X
Xnline(ln)
Xint ln;
X{
X printf("%4d :\t",ln);
X}
X
Xmain ()
X{
X
X line = 0; nline(++line);
X yyparse ();
X list_xref(table);
X fprintf(stdout,"\n\n\tEnd of X-ref\n\t~~~~~~~~~~~~\n");
X}
/
echo 'Part 01 of pack.out complete.'
exit
<-----------------------------CUT HERE----------------------------------------->
.... just parsing through ...
UUCP: ...!seismo!mcvax!ukc!dcl-cs!cathy
DARPA: cathy%lancs.comp at ucl-cs | Post: University of Lancaster,
JANET: cathy at uk.ac.lancs.comp | Department of Computing,
Phone: None | Bailrigg, Lancaster, LA1 4YR, UK.
More information about the Comp.sources.unix
mailing list