Net2/usr/src/contrib/isode/pepy/lex.l.gnrc

/* lex.l - lex ASN.1 analyzer */
/* %WARNING% */

%{
#ifndef	lint
static char *RCSid = "$Header: /f/osi/pepy/RCS/lex.l.gnrc,v 7.3 91/02/22 09:34:52 mrose Interim $";
#endif

/* 
 * $Header: /f/osi/pepy/RCS/lex.l.gnrc,v 7.3 91/02/22 09:34:52 mrose Interim $
 *
 *
 * $Log:	lex.l.gnrc,v $
 * Revision 7.3  91/02/22  09:34:52  mrose
 * Interim 6.8
 * 
 * Revision 7.2  90/09/11  00:55:18  mrose
 * big-strings
 * 
 * Revision 7.1  90/09/07  17:34:32  mrose
 * new-macros
 * 
 * Revision 7.0  90/07/01  19:54:35  mrose
 * *** empty log message ***
 * 
 * Revision 7.1  90/05/21  17:08:26  mrose
 * yyporting
 * 
 * Revision 7.0  89/11/23  22:11:40  mrose
 * Release 6.0
 * 
 */

/*
 *				  NOTICE
 *
 *    Acquisition, use, and distribution of this module and related
 *    materials are subject to the restrictions of a license agreement.
 *    Consult the Preface in the User's Manual for the full terms of
 *    this agreement.
 *
 *
 */


struct table {
    char   *t_keyword;
    int	    t_value;
    int	    t_porting;
};

static struct table reserved[] = {
    "ABSENT", ABSENT, 0,
    "ANY", ANY, 0,
    "APPLICATION", APPLICATION, 0,
    "BEGIN", BGIN, 0,
    "BIT", BIT, 0,
    "BITSTRING", BITSTRING, 0,
    "BOOLEAN", BOOLEAN, 0,
    "BY", BY, 0,
    "CHOICE", CHOICE, 0,
    "COMPONENT", COMPONENT, 0,
    "COMPONENTS", COMPONENTS, 0,
    "COMPONENTSOF", COMPONENTSOF, 0,
    "DECODER", DECODER, 0,
    "DEFAULT", DEFAULT, 0,
    "DEFINED", DEFINED, 0,
    "DEFINITIONS", DEFINITIONS, 0,
    "ENCODER", ENCODER, 0,
    "ENCRYPTED", ENCRYPTED, 0,
    "END", END, 0,
    "ENUMERATED", ENUMERATED, 0,
    "EXPLICIT", EXPLICIT, 0,
    "EXPORTS", EXPORTS, 0,
    "FALSE", FALSE, 0,
    "FROM", FROM, 0,
    "IDENTIFIER", IDENTIFIER, 0,
    "IMPLICIT", IMPLICIT, 0,
    "IMPORTS", IMPORTS, 0,
    "INCLUDE", INCLUDES, 0,
    "INTEGER", INTEGER, 0,
    "MIN", MIN, 0,
    "MAX", MAX, 0,
    "NULL", NIL, 0,
    "OBJECT", OBJECT, 0,
    "OCTET", OCTET, 0,
    "OCTETSTRING", OCTETSTRING, 0,
    "OF", OF, 0,
    "OPTIONAL", OPTIONAL, 0,
    "PREFIXES", PREFIXES, 0,
    "PRESENT", PRESENT, 0,
    "PRINTER", PRINTER, 0,
    "PRIVATE", PRIVATE, 0,
    "REAL", REAL, 0,
    "SECTIONS", SECTIONS, 0,
    "SEQUENCE", SEQUENCE, 0,
    "SEQUENCEOF", SEQUENCEOF, 0,
    "SET", SET, 0,
    "SETOF", SETOF, 0,
    "SIZE", SIZE, 0,
    "STRING", STRING, 0,
    "TAGS", TAGS, 0,
    "TRUE", TRUE, 0,
    "UNIVERSAL", UNIVERSAL, 0,
    "WITH", WITH, 0,
    "PLUS-INFINITY", PLUSINFINITY, 0,
    "MINUS-INFINITY", MINUSINFINITY, 0,
%BEGIN(ROSY)%
    "OPERATION", OPERATION, 1,
    "ARGUMENT", ARGUMENT, 0,
    "RESULT", RESULT, 0,
    "ERRORS", ERRORS, 0,
    "LINKED", LINKED, 0,
    "ERROR", ERROR, 1,
    "PARAMETER", PARAMETER, 0,
/* start new stuff */
    "ABSTRACT-OPERATION", OPERATION, 0,
    "ABSTRACT-ERROR", ERROR, 0,
    "ABSTRACT", ABSTRACT, 0,
    "OPERATIONS", OPERATIONS, 0,
    "CONSUMER", CONSUMER, 0,
    "SUPPLIER", SUPPLIER, 0,
    "INVOKES", INVOKES, 0,
    "PORT", PORT, 0,
    "PORTS", PORTS, 0,
/* refine is beyond me! (JPO)
    "REFINE", REFINE, 0,
    "AS", AS, 0,
    "RECURRING", RECURRING, 0,
    "VISIBLE", VISIBLE, 0,
    "PAIRED", PAIRED, 0,
*/
/* end new stuff */
%END(ROSY)%
%BEGIN(MOSY)%
    "OBJECT-TYPE", OBJECTYPE, 1,
    "SYNTAX", SYNTAX, 0,
    "ACCESS", ACCESS, 0,
    "STATUS", STATUS, 0,
    "DESCRIPTION", DESCRIPTION, 0,
    "REFERENCE", REFERENCE, 0,
    "INDEX", INDEX, 0,
    "DEFVAL", DEFVAL, 0,

    "TRAP-TYPE", TRAPTYPE, 1,
    "ENTERPRISE", ENTERPRISE, 0,
    "VARIABLES", VARIABLES, 0,
%END(MOSY)%
    NULL, 0
};
%}

%%

"--"			{   register int c, d;

			    for (d = 0; c = input (); d = c == '-')
				if (c == '\n' || (d && c == '-'))
				    break;
			}
[ \t]*			{
			    if (yydebug)
				fprintf (stderr, "WT\n");
			}
\n			{
			    if (yydebug)
				fprintf (stderr, "NL\n");
			}
"::="			{
			    if (yydebug)
				fprintf (stderr, "SY: CCE\n");
			    return CCE;
			}
"..."			{
			    if (yydebug)
			    	fprintf (stderr, "SY: DOTDOTDOT\n");
			    return DOTDOTDOT;
			}
".."			{
    			    if (yydebug)
				fprintf (stderr, "SY: DOTDOT\n");
			    return DOTDOT;
			}
"."			{
			    if (yydebug)
				fprintf (stderr, "SY: DOT\n");
			    return DOT;
			}
";"			{
			    if (yydebug)
				fprintf (stderr, "SY: SEMICOLON");
			    return SEMICOLON;
			}
","			{
			    if (yydebug)
				fprintf (stderr, "SY: COMMA\n");
			    return COMMA;
			}
"{"			{
			    if (yydebug)
				fprintf (stderr, "SY: LBRACE\n");
			    return LBRACE;
			}
"}"			{
			    if (yydebug)
				fprintf (stderr, "SY: RBRACE\n");
			    return RBRACE;
			}
"|"			{
			    if (yydebug)
				fprintf (stderr, "SY: BAR\n");
			    return BAR;
			}
%BEGIN(ROSY)%
"[S]"			{
			    if (yydebug)
				fprintf (stderr, "SY: OBJECTSUPPLIER\n");
			    return OBJECTSUPPLIER;
			}
"[C]"			{
			    if (yydebug)
				fprintf (stderr, "SY: OBJECTCONSUMER\n");
			    return OBJECTCONSUMER;
			}
%END(ROSY)%
"[["|"$"|"<<"		{   register int tok, c, d, len;
			    register char *cp, *ep, *pp;

			    if (*yytext == '$')
				tok = VLENGTH;
			    else
				if (*yytext == '<')
				    tok = CONTROL;
				else {
				    while((c = input()) == ' ' || c =='\t')
				        continue;
				    switch (c) {
					case 'a': tok = VALA;
						  break;
					case 'b': tok = VALB;
						  break;
					case 'i': tok = VALI;
						  break;
					case 's': tok = VALS;
						  break;
					case 'o': tok = VALO;
						  break;
					case 'x': tok = VALX;
						  break;
					case 'p': tok = VALP;
						  break;
					case 'q': tok = VALQ;
					    	  break;
					case 'r': tok = VALR;
						  break;
					case 'O': tok = VALOID;
						  break;
					case 'P': tok = PARAMETERTYPE;
					    	  break;
					default : myyerror ("unknown token: \"%s\"", yytext);
						  break;
				    }
				    if ((c = input()) != ' ' && c != '\t'
					&& c != '\n')
					yyerror ("syntax error in [[ ... ]]");
				}
 
			    if ((pp = malloc ((unsigned) (len = BUFSIZ)))
				    == NULL)
				yyerror ("out of memory");

			    for (ep = (cp = pp) + len - 1, d = NULL;; d = c) {
				if ((c = input ()) == NULL)
				    yyerror ("end-of-file while reading value");
				if ((d == ']' && c == ']' && tok !=CONTROL) ||
				    (c == '$' && (tok ==VALX || tok ==VALO)) ||
				    (d == '>' && c == '>' && tok ==CONTROL)) {
				    if ((tok == VALX || tok == VALO) &&
				       (c != '$'))
				       yyerror("Missing '$' in [[ - ]]");
				    if (c == '$') {unput(c); *cp = NULL;}
				    else *--cp = NULL;
				    yylval.yy_string = pp;
				    if (yydebug)
					fprintf (stderr, "VAL: \"%s\"\n",
						yylval.yy_string);
				    return tok;
				}
				if (cp >= ep) {
				    register int curlen = cp - pp;
				    register char *dp;

				    if ((dp = realloc (pp,
						(unsigned) (len += BUFSIZ)))
					    == NULL)
					yyerror ("out of memory");
				    cp = dp + curlen;
				    ep = (pp = dp) + len - 1;
				}
				*cp++ = c;
			    }
			}
"["			{
			    if (yydebug)
				fprintf (stderr, "SY: LBRACKET\n");
			    return LBRACKET;
			}
"]"			{
			    if (yydebug)
				fprintf (stderr, "SY: RBRACKET\n");
			    return RBRACKET;
			}
"<"			{
			    if (yydebug)
				fprintf (stderr, "SY: LANGLE\n");
			    return LANGLE;
			}
"("			{
			    if (yydebug)
				fprintf (stderr, "SY: LPAREN\n");
			    return LPAREN;
			}
")"			{
			    if (yydebug)
				fprintf (stderr, "SY: RPAREN\n");
			    return RPAREN;
			}
[0-9]+			{
			    (void) sscanf (yytext, "%d", &yylval.yy_number);
			    if (yydebug)
				fprintf (stderr, "LIT: 0x%x\n", yylval.yy_number);
			    return LITNUMBER;
			}
-[0-9]+			{
			    (void) sscanf (yytext, "%d", &yylval.yy_number);
			    if (yydebug)
				fprintf (stderr, "LIT: 0x%x\n", yylval.yy_number);
			    return LITNUMBER;
			}
'[^'$]*'[BbHh]		{   register char *cp; register int i;

			    switch (*(cp = yytext + strlen (yytext) - 1)) {
				case 'H':
				case 'h':
				    *cp = NULL;
				    (void) sscanf (yytext + 1, "%x",
						&yylval.yy_number);
				    break;

				case 'B':
				case 'b':
				    *cp-- = NULL, *cp = NULL;
				    for (i = 0, cp = yytext + 1; *cp; ) {
					i <<= 1;
					i += *cp++ - '0';
				    }
				    yylval.yy_number = i;
				    break; 
			    }
			    if (yydebug)
				fprintf (stderr, "LIT: 0x%x\n", yylval.yy_number);
			    return LITNUMBER;
			}
\"			{
			    int	    c, len;
			    register char *cp, *ep, *pp;

			    if ((pp = malloc ((unsigned) (len = BUFSIZ)))
				    == NULL)
				yyerror ("out of memory");

			    for (ep = (cp = pp) + len - 1;;) {
				if ((c = input ()) == NULL)
				    yyerror ("end-of-file while reading string");
				if (c == '"')
				    break;

				if (cp >= ep) {
				    register int curlen = cp - pp;
				    register char *dp;

				    if ((dp = realloc (pp,
						       (unsigned) (len += BUFSIZ)))
					    == NULL)
					yyerror ("out of memory");
				    cp = dp + curlen;
				    ep = (pp = dp) + len - 1;
				}
				*cp++ = c;
			    }
			    *cp = NULL;
			    yylval.yy_string = pp;
			    if (yydebug)
				fprintf (stderr, "LIT: \"%s\"\n",
					 yylval.yy_string);
			    return LITSTRING;
			}
[A-Z][A-Za-z0-9-]*	{   register struct table *t;

			    for (t = reserved; t -> t_keyword; t++)
				if (strcmp (t -> t_keyword, yytext) == 0) {
				    if (yyporting && t -> t_porting)
					break;
				    if (yydebug)
					fprintf (stderr,
						  "KE: \"%s\"\n", yytext);
				    return t -> t_value;
				}
			    yylval.yy_string = new_string (yytext);
			    if (yydebug)
				fprintf (stderr, "ID: \"%s\"\n", yylval.yy_string);
			    return ID;
			}
[a-z][A-Za-z0-9-]*	{   yylval.yy_string = new_string (yytext);
			    if (yydebug)
				fprintf (stderr, "NAME: \"%s\"\n", yylval.yy_string);
			    return NAME;
			}
"%["			{   register int c, d, len;
			    register char *cp, *ep, *pp;

			    if ((pp = malloc ((unsigned) (len = BUFSIZ)))
				    == NULL)
				yyerror ("out of memory");

			    for (ep = (cp = pp) + len - 1, d = NULL;; d = c) {
				if ((c = input ()) == NULL)
				    yyerror ("end-of-file while reading value");
				if (d == '%' && c == ']' ) {
				    *--cp = NULL;
				    yylval.yy_string = pp;
				    if (yydebug)
					fprintf (stderr, "VAL: \"%s\"\n",
						 yylval.yy_string);
				    return SCTRL;
				}
				if (d == '\n')
				    yyerror ("newline in %[ %] construct");
				if (cp >= ep) {
				    register int curlen = cp - pp;
				    register char *dp;

				    if ((dp = realloc (pp,
						(unsigned) (len += BUFSIZ)))
					    == NULL)
					yyerror ("out of memory");
				    cp = dp + curlen;
				    ep = (pp = dp) + len - 1;
				}
				*cp++ = c;
			    }
			}
"%{"			{   register int c, d, len;
			    int	    mylineno;
			    register char *cp, *ep, *pp;

			    mylineno = yylineno;
			    if ((pp = malloc ((unsigned) (len = BUFSIZ)))
				    == NULL)
				yyerror ("out of memory");

			    for (ep = (cp = pp) + len - 1, d = NULL;; d = c) {
				if ((c = input ()) == NULL)
				    yyerror ("end-of-file while reading action");
				if (d == '%' && c == '}') {
				    *--cp = NULL;
				    yylval.yy_action = new_action (pp, mylineno);;
				    if (yydebug)
					fprintf (stderr, "ACTION: \"%s\", %d\n",
						yylval.yy_action -> ya_text,
						yylval.yy_action -> ya_lineno);
				    return ACTION;
				}
				if (cp >= ep) {
				    register int curlen = cp - pp;
				    register char *dp;

				    if ((dp = realloc (pp,
						(unsigned) (len += BUFSIZ)))
					    == NULL)
					yyerror ("out of memory");
				    cp = dp + curlen;
				    ep = (pp = dp) + len - 1;
				}
				*cp++ = c;
			    }
			}
.			{   
			    myyerror ("unknown token: \"%s\"", yytext);
			}

%%