Blame lib/scanner-sming.l

Packit 022b05
/*
Packit 022b05
 * scanner-sming.l --
Packit 022b05
 *
Packit 022b05
 *      Lexical rules for scanning the SMIng MIB module language.
Packit 022b05
 *
Packit 022b05
 * Copyright (c) 1999 Frank Strauss, Technical University of Braunschweig.
Packit 022b05
 *
Packit 022b05
 * See the file "COPYING" for information on usage and redistribution
Packit 022b05
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
Packit 022b05
 *
Packit 022b05
 * @(#) $Id: scanner-sming.l 7734 2008-02-15 07:49:14Z schoenw $
Packit 022b05
 */
Packit 022b05
Packit 022b05
%option noyywrap
Packit 022b05
Packit 022b05
%{
Packit 022b05
Packit 022b05
#include <config.h>
Packit 022b05
    
Packit 022b05
#ifdef BACKEND_SMING
Packit 022b05
Packit 022b05
#include <stdio.h>
Packit 022b05
#include <string.h>
Packit 022b05
#include <ctype.h>
Packit 022b05
#include <errno.h>
Packit 022b05
Packit 022b05
#if defined(HAVE_WIN_H)
Packit 022b05
#include "win.h"
Packit 022b05
#endif
Packit 022b05
Packit 022b05
#include "error.h"
Packit 022b05
#include "util.h"
Packit 022b05
#include "parser-sming.h"
Packit 022b05
#include "parser-sming.tab.h"
Packit 022b05
#include "scanner-sming.h"
Packit 022b05
Packit 022b05
#ifdef HAVE_DMALLOC_H
Packit 022b05
#include <dmalloc.h>
Packit 022b05
#endif
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
/* we need a reentrant parser, so yylex gets arguments */
Packit 022b05
#if 0
Packit 022b05
#define YY_DECL int yylex YY_PROTO((YYSTYPE *lvalp, void *parser))
Packit 022b05
#else
Packit 022b05
#define YY_DECL int yylex(YYSTYPE *lvalp, void *parser)
Packit 022b05
#endif
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
#define thisParser (*(Parser *) parser)
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
#define MAX_NUMBER		"18446744073709551615" /* max Counter64 */
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
/*
Packit 022b05
 * This makes the usual notation when referencing attributes also
Packit 022b05
 * work with our pure parser code.
Packit 022b05
 */
Packit 022b05
#define yylval (*lvalp)
Packit 022b05
Packit 022b05
Packit 022b05
static YY_BUFFER_STATE yybuffer[MAX_LEX_DEPTH];
Packit 022b05
Packit 022b05
static int lexDepth = 0; 
Packit 022b05
Packit 022b05
 
Packit 022b05
int
Packit 022b05
smingEnterLexRecursion(file)
Packit 022b05
    FILE *file;
Packit 022b05
{
Packit 022b05
    if (lexDepth >= MAX_LEX_DEPTH) {
Packit 022b05
	return (-1);
Packit 022b05
    }
Packit 022b05
    yybuffer[lexDepth++] = YY_CURRENT_BUFFER;
Packit 022b05
    yy_switch_to_buffer(yy_create_buffer(file, YY_BUF_SIZE));
Packit 022b05
    return (lexDepth);
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
 
Packit 022b05
void
Packit 022b05
smingLeaveLexRecursion()
Packit 022b05
{    
Packit 022b05
    yy_delete_buffer(YY_CURRENT_BUFFER);
Packit 022b05
    yy_switch_to_buffer(yybuffer[--lexDepth]);
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
%}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
/*
Packit 022b05
 * Lex pattern definitions.
Packit 022b05
 */
Packit 022b05
delim		([^a-zA-Z0-9-])
Packit 022b05
lineBreak       ("\n"|"\n\015"|"\015\n")
Packit 022b05
WSP		(" "|"\t")
Packit 022b05
VCHAR		([\041-\176])
Packit 022b05
HTAB		"\t"
Packit 022b05
SP		" "
Packit 022b05
Packit 022b05
Packit 022b05
/*
Packit 022b05
 * Lex state definitions.
Packit 022b05
 */
Packit 022b05
%s		Skipline
Packit 022b05
Packit 022b05
%%
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
 /*
Packit 022b05
  * Lex rules for comments. Do you use {lineBreak} here because it
Packit 022b05
  * introduces a trailing context which is (a) slow and (b) causes
Packit 022b05
  * REJECT to be used.
Packit 022b05
  */
Packit 022b05
Packit 022b05
<INITIAL>"//"({WSP}|{VCHAR})*/"\n" {
Packit 022b05
}
Packit 022b05
Packit 022b05
<INITIAL>"//"({WSP}|{VCHAR})*/"\n\015" {
Packit 022b05
}
Packit 022b05
Packit 022b05
<INITIAL>"//"({WSP}|{VCHAR})*/"\015\n" {
Packit 022b05
}
Packit 022b05
Packit 022b05
 /*
Packit 022b05
  * Lex rules for some special tokens.
Packit 022b05
  */
Packit 022b05
Packit 022b05
<INITIAL>[\{\}\(\)\;\,\-\.\|] {
Packit 022b05
    return yytext[0];
Packit 022b05
}
Packit 022b05
    
Packit 022b05
<INITIAL>".." {
Packit 022b05
    return DOT_DOT;
Packit 022b05
}
Packit 022b05
Packit 022b05
<INITIAL>"."/[^\.] {
Packit 022b05
    return DOT;
Packit 022b05
}
Packit 022b05
Packit 022b05
<INITIAL>"::" {
Packit 022b05
    return COLON_COLON;
Packit 022b05
}
Packit 022b05
Packit 022b05
 /*
Packit 022b05
  * Lex rules for separators.
Packit 022b05
  */
Packit 022b05
Packit 022b05
<INITIAL>{lineBreak} {
Packit 022b05
    thisParser.line++;
Packit 022b05
}
Packit 022b05
Packit 022b05
<INITIAL>{WSP} {
Packit 022b05
}
Packit 022b05
Packit 022b05
 /*
Packit 022b05
  * Lex rules for known keywords.
Packit 022b05
  */
Packit 022b05
Packit 022b05
<INITIAL>module/{delim} {
Packit 022b05
    yylval.id = yytext;
Packit 022b05
    return moduleKeyword;
Packit 022b05
}
Packit 022b05
Packit 022b05
<INITIAL>import/{delim} {
Packit 022b05
    yylval.id = yytext;
Packit 022b05
    return importKeyword;
Packit 022b05
}
Packit 022b05
Packit 022b05
<INITIAL>revision/{delim} {
Packit 022b05
    yylval.id = yytext;
Packit 022b05
    return revisionKeyword;
Packit 022b05
}
Packit 022b05
Packit 022b05
<INITIAL>date/{delim} {
Packit 022b05
    yylval.id = yytext;
Packit 022b05
    return dateKeyword;
Packit 022b05
}
Packit 022b05
Packit 022b05
<INITIAL>organization/{delim} {
Packit 022b05
    yylval.id = yytext;
Packit 022b05
    return organizationKeyword;
Packit 022b05
}
Packit 022b05
Packit 022b05
<INITIAL>contact/{delim} {
Packit 022b05
    yylval.id = yytext;
Packit 022b05
    return contactKeyword;
Packit 022b05
}
Packit 022b05
Packit 022b05
<INITIAL>description/{delim} {
Packit 022b05
    yylval.id = yytext;
Packit 022b05
    return descriptionKeyword;
Packit 022b05
}
Packit 022b05
Packit 022b05
<INITIAL>reference/{delim} {
Packit 022b05
    yylval.id = yytext;
Packit 022b05
    return referenceKeyword;
Packit 022b05
}
Packit 022b05
Packit 022b05
<INITIAL>extension/{delim} {
Packit 022b05
    yylval.id = yytext;
Packit 022b05
    return extensionKeyword;
Packit 022b05
}
Packit 022b05
Packit 022b05
<INITIAL>typedef/{delim} {
Packit 022b05
    yylval.id = yytext;
Packit 022b05
    return typedefKeyword;
Packit 022b05
}
Packit 022b05
Packit 022b05
<INITIAL>type/{delim} {
Packit 022b05
    yylval.id = yytext;
Packit 022b05
    return typeKeyword;
Packit 022b05
}
Packit 022b05
Packit 022b05
<INITIAL>parent/{delim} {
Packit 022b05
    yylval.id = yytext;
Packit 022b05
    return parentKeyword;
Packit 022b05
}
Packit 022b05
Packit 022b05
<INITIAL>identity/{delim} {
Packit 022b05
    yylval.id = yytext;
Packit 022b05
    return identityKeyword;
Packit 022b05
}
Packit 022b05
Packit 022b05
<INITIAL>class/{delim} {
Packit 022b05
    yylval.id = yytext;
Packit 022b05
    return classKeyword;
Packit 022b05
}
Packit 022b05
Packit 022b05
<INITIAL>extends/{delim} {
Packit 022b05
    yylval.id = yytext;
Packit 022b05
    return extendsKeyword;
Packit 022b05
}
Packit 022b05
Packit 022b05
<INITIAL>attribute/{delim} {
Packit 022b05
    yylval.id = yytext;
Packit 022b05
    return attributeKeyword;
Packit 022b05
}
Packit 022b05
Packit 022b05
<INITIAL>unique/{delim} {
Packit 022b05
    yylval.id = yytext;
Packit 022b05
    return uniqueKeyword;
Packit 022b05
}
Packit 022b05
Packit 022b05
<INITIAL>event/{delim} {
Packit 022b05
    yylval.id = yytext;
Packit 022b05
    return eventKeyword;
Packit 022b05
}
Packit 022b05
Packit 022b05
<INITIAL>format/{delim} {
Packit 022b05
    yylval.id = yytext;
Packit 022b05
    return formatKeyword;
Packit 022b05
}
Packit 022b05
Packit 022b05
<INITIAL>units/{delim} {
Packit 022b05
    yylval.id = yytext;
Packit 022b05
    return unitsKeyword;
Packit 022b05
}
Packit 022b05
Packit 022b05
<INITIAL>status/{delim} {
Packit 022b05
    yylval.id = yytext;
Packit 022b05
    return statusKeyword;
Packit 022b05
}
Packit 022b05
Packit 022b05
<INITIAL>access/{delim} {
Packit 022b05
    yylval.id = yytext;
Packit 022b05
    return accessKeyword;
Packit 022b05
}
Packit 022b05
Packit 022b05
<INITIAL>default/{delim} {
Packit 022b05
    yylval.id = yytext;
Packit 022b05
    return defaultKeyword;
Packit 022b05
}
Packit 022b05
Packit 022b05
<INITIAL>abnf/{delim} {
Packit 022b05
    yylval.id = yytext;
Packit 022b05
    return abnfKeyword;
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
 /*
Packit 022b05
  *Base types keywords
Packit 022b05
  */
Packit 022b05
<INITIAL>OctetString/{delim} {
Packit 022b05
    yylval.id = yytext;
Packit 022b05
    return OctetStringKeyword;
Packit 022b05
}
Packit 022b05
Packit 022b05
<INITIAL>Pointer/{delim} {
Packit 022b05
    yylval.id = yytext;
Packit 022b05
    return PointerKeyword;
Packit 022b05
}
Packit 022b05
Packit 022b05
<INITIAL>ObjectIdentifier/{delim} {
Packit 022b05
    yylval.id = yytext;
Packit 022b05
    return ObjectIdentifierKeyword;
Packit 022b05
}
Packit 022b05
Packit 022b05
<INITIAL>Integer32/{delim} {
Packit 022b05
    yylval.id = yytext;
Packit 022b05
    return Integer32Keyword;
Packit 022b05
}
Packit 022b05
Packit 022b05
<INITIAL>Integer64/{delim} {
Packit 022b05
    yylval.id = yytext;
Packit 022b05
    return Integer64Keyword;
Packit 022b05
}
Packit 022b05
Packit 022b05
<INITIAL>Unsigned32/{delim} {
Packit 022b05
    yylval.id = yytext;
Packit 022b05
    return Unsigned32Keyword;
Packit 022b05
}
Packit 022b05
Packit 022b05
<INITIAL>Unsigned64/{delim} {
Packit 022b05
    yylval.id = yytext;
Packit 022b05
    return Unsigned64Keyword;
Packit 022b05
}
Packit 022b05
Packit 022b05
<INITIAL>Float32/{delim} {
Packit 022b05
    yylval.id = yytext;
Packit 022b05
    return Float32Keyword;
Packit 022b05
}
Packit 022b05
Packit 022b05
<INITIAL>Float64/{delim} {
Packit 022b05
    yylval.id = yytext;
Packit 022b05
    return Float64Keyword;
Packit 022b05
}
Packit 022b05
Packit 022b05
<INITIAL>Float128/{delim} {
Packit 022b05
    yylval.id = yytext;
Packit 022b05
    return Float128Keyword;
Packit 022b05
}
Packit 022b05
Packit 022b05
<INITIAL>Bits/{delim} {
Packit 022b05
    yylval.id = yytext;
Packit 022b05
    return BitsKeyword;
Packit 022b05
}
Packit 022b05
Packit 022b05
<INITIAL>Enumeration/{delim} {
Packit 022b05
    yylval.id = yytext;
Packit 022b05
    return EnumerationKeyword;
Packit 022b05
}
Packit 022b05
Packit 022b05
 /*
Packit 022b05
  *Status keywords
Packit 022b05
  */
Packit 022b05
Packit 022b05
<INITIAL>current/{delim} {
Packit 022b05
    yylval.id = yytext;
Packit 022b05
    return currentKeyword;
Packit 022b05
}
Packit 022b05
Packit 022b05
<INITIAL>deprecated/{delim} {
Packit 022b05
    yylval.id = yytext;
Packit 022b05
    return deprecatedKeyword;
Packit 022b05
}
Packit 022b05
Packit 022b05
<INITIAL>obsolete/{delim} {
Packit 022b05
    yylval.id = yytext;
Packit 022b05
    return obsoleteKeyword;
Packit 022b05
}
Packit 022b05
Packit 022b05
 /*
Packit 022b05
  *Access keywords
Packit 022b05
  */
Packit 022b05
Packit 022b05
<INITIAL>eventonly/{delim} {
Packit 022b05
    yylval.id = yytext;
Packit 022b05
    return eventonlyKeyword;
Packit 022b05
}
Packit 022b05
Packit 022b05
<INITIAL>readonly/{delim} {
Packit 022b05
    yylval.id = yytext;
Packit 022b05
    return readonlyKeyword;
Packit 022b05
}
Packit 022b05
Packit 022b05
<INITIAL>readwrite/{delim} {
Packit 022b05
    yylval.id = yytext;
Packit 022b05
    return readwriteKeyword;
Packit 022b05
}
Packit 022b05
Packit 022b05
 /*
Packit 022b05
  *Special floating point values' keywords
Packit 022b05
  */
Packit 022b05
Packit 022b05
<INITIAL>neginf/{delim} {
Packit 022b05
    yylval.id = yytext;
Packit 022b05
    return neginfKeyword;
Packit 022b05
}
Packit 022b05
Packit 022b05
<INITIAL>posinf/{delim} {
Packit 022b05
    yylval.id = yytext;
Packit 022b05
    return posinfKeyword;
Packit 022b05
}
Packit 022b05
Packit 022b05
<INITIAL>snan/{delim} {
Packit 022b05
    yylval.id = yytext;
Packit 022b05
    return snanKeyword;
Packit 022b05
}
Packit 022b05
Packit 022b05
<INITIAL>qnan/{delim} {
Packit 022b05
    yylval.id = yytext;
Packit 022b05
    return qnanKeyword;
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
Packit 022b05
 /*
Packit 022b05
  * Lex rules for identifiers.
Packit 022b05
  */
Packit 022b05
Packit 022b05
 /* e.g. module names: REF: draft,p.12-13 */
Packit 022b05
<INITIAL>[A-Z](-?[a-zA-Z0-9_]+)*-? {
Packit 022b05
    if (yytext[yyleng-1] == '-') {
Packit 022b05
	smiPrintError(parser, ERR_ID_ENDS_IN_HYPHEN, yytext);
Packit 022b05
    }
Packit 022b05
    if (yyleng > 64) {
Packit 022b05
	smiPrintError(parser, ERR_UCIDENTIFIER_64, yytext);
Packit 022b05
    }
Packit 022b05
    if (strchr(yytext, '_')) {
Packit 022b05
        smiPrintError(parser, ERR_UNDERSCORE_IN_IDENTIFIER, yytext);
Packit 022b05
    }
Packit 022b05
    yylval.text = smiStrdup(yytext);
Packit 022b05
    return ucIdentifier;
Packit 022b05
}
Packit 022b05
Packit 022b05
 /* same for lowercase names */
Packit 022b05
<INITIAL>[a-z](-?[a-zA-Z0-9_]+)*-? {
Packit 022b05
    if (yytext[yyleng-1] == '-') {
Packit 022b05
	smiPrintError(parser, ERR_ID_ENDS_IN_HYPHEN, yytext);
Packit 022b05
    }
Packit 022b05
    if (yyleng > 64) {
Packit 022b05
	smiPrintError(parser, ERR_LCIDENTIFIER_64, yytext);
Packit 022b05
    }
Packit 022b05
    if (strchr(yytext, '_')) {
Packit 022b05
        smiPrintError(parser, ERR_UNDERSCORE_IN_IDENTIFIER, yytext);
Packit 022b05
    }
Packit 022b05
    yylval.text = smiStrdup(yytext);
Packit 022b05
    return lcIdentifier;
Packit 022b05
}
Packit 022b05
Packit 022b05
 /*
Packit 022b05
  * Lex rules for numbers.
Packit 022b05
  *
Packit 022b05
  * NOTE: `-' is a separate token. Hence, there are no negative numbers.
Packit 022b05
  */
Packit 022b05
Packit 022b05
<INITIAL>0+/[0-9] {
Packit 022b05
    smiPrintError(parser, ERR_LEADING_ZEROS);
Packit 022b05
}
Packit 022b05
Packit 022b05
<INITIAL>([1-9][0-9]*|0)/[^0-9] {
Packit 022b05
    if ((yyleng > sizeof(MAX_NUMBER)-1) ||
Packit 022b05
	((yyleng == sizeof(MAX_NUMBER)-1) &&
Packit 022b05
	 (strcmp(yytext, MAX_NUMBER) > 0))) {
Packit 022b05
	smiPrintError(parser, ERR_NUMBER_TOO_LARGE, yytext);
Packit 022b05
    }
Packit 022b05
    yylval.text = yytext;
Packit 022b05
    return decimalNumber;
Packit 022b05
}
Packit 022b05
Packit 022b05
<INITIAL>0x[0-9a-fA-F]+/[^0-9a-fA-F] {
Packit 022b05
    if (yyleng % 2) {
Packit 022b05
	smiPrintError(parser, ERR_HEX_STRING_MUL2, yytext);
Packit 022b05
    }
Packit 022b05
    yylval.text = yytext;
Packit 022b05
    return hexadecimalNumber;
Packit 022b05
}
Packit 022b05
 /*
Packit 022b05
  * Lex rules for floating point values.
Packit 022b05
  */
Packit 022b05
Packit 022b05
<INITIAL>([0-9]*\.[0-9]+([eE][+-]?[0-9]+)?)/[^0-9] {
Packit 022b05
    yylval.text = yytext;
Packit 022b05
    return floatValue;
Packit 022b05
}
Packit 022b05
Packit 022b05
 /*
Packit 022b05
  * Lex rules for OID's.
Packit 022b05
  */
Packit 022b05
  
Packit 022b05
<INITIAL>([0-9A-Za-z]-?)+\.([0-9A-Za-z]-?)+\.([0-9A-Za-z]-?)+(\.([0-9A-Za-z]-?)+)*/([^0-9A-Za-z]) {
Packit 022b05
    yylval.text = yytext;
Packit 022b05
    return OID;
Packit 022b05
}
Packit 022b05
Packit 022b05
Packit 022b05
 /*
Packit 022b05
  * Lex rules for textSegments.
Packit 022b05
  */
Packit 022b05
Packit 022b05
<INITIAL>\"([^\"]|(\\\"))*\" {
Packit 022b05
    char *s, *d;		/* the source and destination pointer */
Packit 022b05
    int column = 0;		/* the current column */
Packit 022b05
    int newlineflag = 0;	/* we have just passed a newline */
Packit 022b05
    int cutoffcolumn = 0;	/* cut off white space up to this column */
Packit 022b05
				/* (computed by caculating the indentation */
Packit 022b05
				/* of the first column) */
Packit 022b05
Packit 022b05
    yytext[yyleng-1] = '\0';
Packit 022b05
    for (d = yytext, s = yytext+1; s[0]; s++, d++) {
Packit 022b05
Packit 022b05
	if ((s[0] == '\n' && s[1] == '\r')	/* newline sequence */
Packit 022b05
	    || (s[0] == '\r' && s[1] == '\n')) {
Packit 022b05
	    thisParser.line += 1;
Packit 022b05
	    d[0] = '\n';
Packit 022b05
	    s++;
Packit 022b05
	    newlineflag = 1;
Packit 022b05
	    column = 0;
Packit 022b05
	    if (cutoffcolumn < 0) cutoffcolumn = 0;
Packit 022b05
	} else if (s[0] == '\n') {		/* simple newline */
Packit 022b05
	    thisParser.line += 1;
Packit 022b05
	    d[0] = '\n';
Packit 022b05
	    newlineflag = 1;
Packit 022b05
	    column = 0;
Packit 022b05
	    if (cutoffcolumn < 0) cutoffcolumn = 0;
Packit 022b05
	} else {
Packit 022b05
	    if (newlineflag && isspace((int)(unsigned char)s[0])) {	/* space after newline */
Packit 022b05
		if (cutoffcolumn <= 0) {
Packit 022b05
		    cutoffcolumn -= (s[0] == '\t') ? (8-((column-1) % 8)) : 1;
Packit 022b05
		}
Packit 022b05
		column += (s[0] == '\t') ? (8-((column-1) % 8)) : 1;
Packit 022b05
		if (cutoffcolumn <= 0 || column <= cutoffcolumn) {
Packit 022b05
		    d--;
Packit 022b05
		} else {
Packit 022b05
		    d[0] = s[0];
Packit 022b05
		    newlineflag = 0;
Packit 022b05
		}
Packit 022b05
	    } else {				/* everything else */
Packit 022b05
		if (! isascii(s[0])) {
Packit 022b05
		    smiPrintError(parser, ERR_ILLEGAL_CHAR_IN_STRING,
Packit 022b05
				  s[0], (unsigned char) s[0]);
Packit 022b05
		}
Packit 022b05
		d[0] = s[0];
Packit 022b05
		newlineflag = 0;
Packit 022b05
		if (cutoffcolumn < 0) {
Packit 022b05
		    cutoffcolumn *= -1;
Packit 022b05
		}
Packit 022b05
	    }
Packit 022b05
	}
Packit 022b05
    }
Packit 022b05
    d[0] = '\0';
Packit 022b05
Packit 022b05
    yylval.text = yytext;
Packit 022b05
    return textSegment;
Packit 022b05
}
Packit 022b05
Packit 022b05
 /*
Packit 022b05
  * Skip the remainder of the line
Packit 022b05
  */
Packit 022b05
<Skipline>.*{lineBreak} {
Packit 022b05
    thisParser.line++;
Packit 022b05
    BEGIN(INITIAL);
Packit 022b05
}
Packit 022b05
Packit 022b05
 /*
Packit 022b05
  * Everything else...
Packit 022b05
  */
Packit 022b05
Packit 022b05
. {
Packit 022b05
    smiPrintError(parser, ERR_LEX_UNEXPECTED_CHAR);
Packit 022b05
    BEGIN(Skipline);
Packit 022b05
}
Packit 022b05
Packit 022b05
%%
Packit 022b05
Packit 022b05
#endif