|
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
|