1b528cefcSMark Murray %{ 2b528cefcSMark Murray /* 3ae771770SStanislav Sedov * Copyright (c) 1997 - 2005 Kungliga Tekniska Högskolan 4b528cefcSMark Murray * (Royal Institute of Technology, Stockholm, Sweden). 5b528cefcSMark Murray * All rights reserved. 6b528cefcSMark Murray * 7b528cefcSMark Murray * Redistribution and use in source and binary forms, with or without 8b528cefcSMark Murray * modification, are permitted provided that the following conditions 9b528cefcSMark Murray * are met: 10b528cefcSMark Murray * 11b528cefcSMark Murray * 1. Redistributions of source code must retain the above copyright 12b528cefcSMark Murray * notice, this list of conditions and the following disclaimer. 13b528cefcSMark Murray * 14b528cefcSMark Murray * 2. Redistributions in binary form must reproduce the above copyright 15b528cefcSMark Murray * notice, this list of conditions and the following disclaimer in the 16b528cefcSMark Murray * documentation and/or other materials provided with the distribution. 17b528cefcSMark Murray * 18b528cefcSMark Murray * 3. Neither the name of the Institute nor the names of its contributors 19b528cefcSMark Murray * may be used to endorse or promote products derived from this software 20b528cefcSMark Murray * without specific prior written permission. 21b528cefcSMark Murray * 22b528cefcSMark Murray * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND 23b528cefcSMark Murray * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 24b528cefcSMark Murray * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 25b528cefcSMark Murray * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE 26b528cefcSMark Murray * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 27b528cefcSMark Murray * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 28b528cefcSMark Murray * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 29b528cefcSMark Murray * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 30b528cefcSMark Murray * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 31b528cefcSMark Murray * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 32b528cefcSMark Murray * SUCH DAMAGE. 33b528cefcSMark Murray */ 34b528cefcSMark Murray 35ae771770SStanislav Sedov /* $Id$ */ 36b528cefcSMark Murray 37b528cefcSMark Murray #ifdef HAVE_CONFIG_H 38b528cefcSMark Murray #include <config.h> 39b528cefcSMark Murray #endif 40b528cefcSMark Murray #include <stdio.h> 41b528cefcSMark Murray #include <stdarg.h> 42b528cefcSMark Murray #include <stdlib.h> 43b528cefcSMark Murray #include <string.h> 44b528cefcSMark Murray #ifdef HAVE_UNISTD_H 45b528cefcSMark Murray #include <unistd.h> 46b528cefcSMark Murray #endif 474137ff4cSJacques Vidrine #undef ECHO 48b528cefcSMark Murray #include "symbol.h" 49ae771770SStanislav Sedov #include "asn1parse.h" 505e9cd1aeSAssar Westerlund #include "lex.h" 515e9cd1aeSAssar Westerlund #include "gen_locl.h" 52b528cefcSMark Murray 53b528cefcSMark Murray static unsigned lineno = 1; 54b528cefcSMark Murray 555e9cd1aeSAssar Westerlund #undef ECHO 565e9cd1aeSAssar Westerlund 57c19800e8SDoug Rabson static void unterminated(const char *, unsigned); 58c19800e8SDoug Rabson 59b528cefcSMark Murray %} 60b528cefcSMark Murray 61c19800e8SDoug Rabson /* This is for broken old lexes (solaris 10 and hpux) */ 62c19800e8SDoug Rabson %e 2000 63c19800e8SDoug Rabson %p 5000 64c19800e8SDoug Rabson %a 5000 65c19800e8SDoug Rabson %n 1000 66c19800e8SDoug Rabson %o 10000 67b528cefcSMark Murray 68b528cefcSMark Murray %% 69c19800e8SDoug Rabson ABSENT { return kw_ABSENT; } 70c19800e8SDoug Rabson ABSTRACT-SYNTAX { return kw_ABSTRACT_SYNTAX; } 71c19800e8SDoug Rabson ALL { return kw_ALL; } 72c19800e8SDoug Rabson APPLICATION { return kw_APPLICATION; } 73c19800e8SDoug Rabson AUTOMATIC { return kw_AUTOMATIC; } 74c19800e8SDoug Rabson BEGIN { return kw_BEGIN; } 75c19800e8SDoug Rabson BIT { return kw_BIT; } 76c19800e8SDoug Rabson BMPString { return kw_BMPString; } 77c19800e8SDoug Rabson BOOLEAN { return kw_BOOLEAN; } 78c19800e8SDoug Rabson BY { return kw_BY; } 79c19800e8SDoug Rabson CHARACTER { return kw_CHARACTER; } 80c19800e8SDoug Rabson CHOICE { return kw_CHOICE; } 81c19800e8SDoug Rabson CLASS { return kw_CLASS; } 82c19800e8SDoug Rabson COMPONENT { return kw_COMPONENT; } 83c19800e8SDoug Rabson COMPONENTS { return kw_COMPONENTS; } 84c19800e8SDoug Rabson CONSTRAINED { return kw_CONSTRAINED; } 85c19800e8SDoug Rabson CONTAINING { return kw_CONTAINING; } 86c19800e8SDoug Rabson DEFAULT { return kw_DEFAULT; } 87c19800e8SDoug Rabson DEFINITIONS { return kw_DEFINITIONS; } 88c19800e8SDoug Rabson EMBEDDED { return kw_EMBEDDED; } 89c19800e8SDoug Rabson ENCODED { return kw_ENCODED; } 90c19800e8SDoug Rabson END { return kw_END; } 91c19800e8SDoug Rabson ENUMERATED { return kw_ENUMERATED; } 92c19800e8SDoug Rabson EXCEPT { return kw_EXCEPT; } 93c19800e8SDoug Rabson EXPLICIT { return kw_EXPLICIT; } 94c19800e8SDoug Rabson EXPORTS { return kw_EXPORTS; } 95c19800e8SDoug Rabson EXTENSIBILITY { return kw_EXTENSIBILITY; } 96c19800e8SDoug Rabson EXTERNAL { return kw_EXTERNAL; } 97c19800e8SDoug Rabson FALSE { return kw_FALSE; } 98c19800e8SDoug Rabson FROM { return kw_FROM; } 99c19800e8SDoug Rabson GeneralString { return kw_GeneralString; } 100c19800e8SDoug Rabson GeneralizedTime { return kw_GeneralizedTime; } 101c19800e8SDoug Rabson GraphicString { return kw_GraphicString; } 102c19800e8SDoug Rabson IA5String { return kw_IA5String; } 103c19800e8SDoug Rabson IDENTIFIER { return kw_IDENTIFIER; } 104c19800e8SDoug Rabson IMPLICIT { return kw_IMPLICIT; } 105c19800e8SDoug Rabson IMPLIED { return kw_IMPLIED; } 106c19800e8SDoug Rabson IMPORTS { return kw_IMPORTS; } 107c19800e8SDoug Rabson INCLUDES { return kw_INCLUDES; } 108c19800e8SDoug Rabson INSTANCE { return kw_INSTANCE; } 109c19800e8SDoug Rabson INTEGER { return kw_INTEGER; } 110c19800e8SDoug Rabson INTERSECTION { return kw_INTERSECTION; } 111c19800e8SDoug Rabson ISO646String { return kw_ISO646String; } 112c19800e8SDoug Rabson MAX { return kw_MAX; } 113c19800e8SDoug Rabson MIN { return kw_MIN; } 114c19800e8SDoug Rabson MINUS-INFINITY { return kw_MINUS_INFINITY; } 115c19800e8SDoug Rabson NULL { return kw_NULL; } 116c19800e8SDoug Rabson NumericString { return kw_NumericString; } 117c19800e8SDoug Rabson OBJECT { return kw_OBJECT; } 118c19800e8SDoug Rabson OCTET { return kw_OCTET; } 119c19800e8SDoug Rabson OF { return kw_OF; } 120c19800e8SDoug Rabson OPTIONAL { return kw_OPTIONAL; } 121c19800e8SDoug Rabson ObjectDescriptor { return kw_ObjectDescriptor; } 122c19800e8SDoug Rabson PATTERN { return kw_PATTERN; } 123c19800e8SDoug Rabson PDV { return kw_PDV; } 124c19800e8SDoug Rabson PLUS-INFINITY { return kw_PLUS_INFINITY; } 125c19800e8SDoug Rabson PRESENT { return kw_PRESENT; } 126c19800e8SDoug Rabson PRIVATE { return kw_PRIVATE; } 127c19800e8SDoug Rabson PrintableString { return kw_PrintableString; } 128c19800e8SDoug Rabson REAL { return kw_REAL; } 129c19800e8SDoug Rabson RELATIVE_OID { return kw_RELATIVE_OID; } 130c19800e8SDoug Rabson SEQUENCE { return kw_SEQUENCE; } 131c19800e8SDoug Rabson SET { return kw_SET; } 132c19800e8SDoug Rabson SIZE { return kw_SIZE; } 133c19800e8SDoug Rabson STRING { return kw_STRING; } 134c19800e8SDoug Rabson SYNTAX { return kw_SYNTAX; } 135c19800e8SDoug Rabson T61String { return kw_T61String; } 136c19800e8SDoug Rabson TAGS { return kw_TAGS; } 137c19800e8SDoug Rabson TRUE { return kw_TRUE; } 138c19800e8SDoug Rabson TYPE-IDENTIFIER { return kw_TYPE_IDENTIFIER; } 139c19800e8SDoug Rabson TeletexString { return kw_TeletexString; } 140c19800e8SDoug Rabson UNION { return kw_UNION; } 141c19800e8SDoug Rabson UNIQUE { return kw_UNIQUE; } 142c19800e8SDoug Rabson UNIVERSAL { return kw_UNIVERSAL; } 143c19800e8SDoug Rabson UTCTime { return kw_UTCTime; } 144c19800e8SDoug Rabson UTF8String { return kw_UTF8String; } 145c19800e8SDoug Rabson UniversalString { return kw_UniversalString; } 146c19800e8SDoug Rabson VideotexString { return kw_VideotexString; } 147c19800e8SDoug Rabson VisibleString { return kw_VisibleString; } 148c19800e8SDoug Rabson WITH { return kw_WITH; } 149c19800e8SDoug Rabson [-,;{}()|] { return *yytext; } 150b528cefcSMark Murray "[" { return *yytext; } 151b528cefcSMark Murray "]" { return *yytext; } 152b528cefcSMark Murray ::= { return EEQUAL; } 153c19800e8SDoug Rabson -- { 154c19800e8SDoug Rabson int c, start_lineno = lineno; 155c19800e8SDoug Rabson int f = 0; 156c19800e8SDoug Rabson while((c = input()) != EOF) { 157c19800e8SDoug Rabson if(f && c == '-') 158c19800e8SDoug Rabson break; 159c19800e8SDoug Rabson if(c == '-') { 160c19800e8SDoug Rabson f = 1; 161c19800e8SDoug Rabson continue; 162c19800e8SDoug Rabson } 163c19800e8SDoug Rabson if(c == '\n') { 164c19800e8SDoug Rabson lineno++; 165c19800e8SDoug Rabson break; 166c19800e8SDoug Rabson } 167c19800e8SDoug Rabson f = 0; 168c19800e8SDoug Rabson } 169c19800e8SDoug Rabson if(c == EOF) 170c19800e8SDoug Rabson unterminated("comment", start_lineno); 171c19800e8SDoug Rabson } 172c19800e8SDoug Rabson \/\* { 173c19800e8SDoug Rabson int c, start_lineno = lineno; 174c19800e8SDoug Rabson int level = 1; 175c19800e8SDoug Rabson int seen_star = 0; 176c19800e8SDoug Rabson int seen_slash = 0; 177c19800e8SDoug Rabson while((c = input()) != EOF) { 178c19800e8SDoug Rabson if(c == '/') { 179c19800e8SDoug Rabson if(seen_star) { 180c19800e8SDoug Rabson if(--level == 0) 181c19800e8SDoug Rabson break; 182c19800e8SDoug Rabson seen_star = 0; 183c19800e8SDoug Rabson continue; 184c19800e8SDoug Rabson } 185c19800e8SDoug Rabson seen_slash = 1; 186c19800e8SDoug Rabson continue; 187c19800e8SDoug Rabson } 188c19800e8SDoug Rabson if(seen_star && c == '/') { 189c19800e8SDoug Rabson if(--level == 0) 190c19800e8SDoug Rabson break; 191c19800e8SDoug Rabson seen_star = 0; 192c19800e8SDoug Rabson continue; 193c19800e8SDoug Rabson } 194c19800e8SDoug Rabson if(c == '*') { 195c19800e8SDoug Rabson if(seen_slash) { 196c19800e8SDoug Rabson level++; 197c19800e8SDoug Rabson seen_star = seen_slash = 0; 198c19800e8SDoug Rabson continue; 199c19800e8SDoug Rabson } 200c19800e8SDoug Rabson seen_star = 1; 201c19800e8SDoug Rabson continue; 202c19800e8SDoug Rabson } 203c19800e8SDoug Rabson seen_star = seen_slash = 0; 204c19800e8SDoug Rabson if(c == '\n') { 205c19800e8SDoug Rabson lineno++; 206c19800e8SDoug Rabson continue; 207c19800e8SDoug Rabson } 208c19800e8SDoug Rabson } 209c19800e8SDoug Rabson if(c == EOF) 210c19800e8SDoug Rabson unterminated("comment", start_lineno); 211c19800e8SDoug Rabson } 212c19800e8SDoug Rabson "\"" { 213c19800e8SDoug Rabson int start_lineno = lineno; 214c19800e8SDoug Rabson int c; 215c19800e8SDoug Rabson char buf[1024]; 216c19800e8SDoug Rabson char *p = buf; 217c19800e8SDoug Rabson int f = 0; 218c19800e8SDoug Rabson int skip_ws = 0; 219c19800e8SDoug Rabson 220c19800e8SDoug Rabson while((c = input()) != EOF) { 221c19800e8SDoug Rabson if(isspace(c) && skip_ws) { 222c19800e8SDoug Rabson if(c == '\n') 223c19800e8SDoug Rabson lineno++; 224c19800e8SDoug Rabson continue; 225c19800e8SDoug Rabson } 226c19800e8SDoug Rabson skip_ws = 0; 227c19800e8SDoug Rabson 228c19800e8SDoug Rabson if(c == '"') { 229c19800e8SDoug Rabson if(f) { 230c19800e8SDoug Rabson *p++ = '"'; 231c19800e8SDoug Rabson f = 0; 232c19800e8SDoug Rabson } else 233c19800e8SDoug Rabson f = 1; 234c19800e8SDoug Rabson continue; 235c19800e8SDoug Rabson } 236c19800e8SDoug Rabson if(f == 1) { 237c19800e8SDoug Rabson unput(c); 238c19800e8SDoug Rabson break; 239c19800e8SDoug Rabson } 240c19800e8SDoug Rabson if(c == '\n') { 241c19800e8SDoug Rabson lineno++; 242c19800e8SDoug Rabson while(p > buf && isspace((unsigned char)p[-1])) 243c19800e8SDoug Rabson p--; 244c19800e8SDoug Rabson skip_ws = 1; 245c19800e8SDoug Rabson continue; 246c19800e8SDoug Rabson } 247c19800e8SDoug Rabson *p++ = c; 248c19800e8SDoug Rabson } 249c19800e8SDoug Rabson if(c == EOF) 250c19800e8SDoug Rabson unterminated("string", start_lineno); 251c19800e8SDoug Rabson *p++ = '\0'; 252c19800e8SDoug Rabson fprintf(stderr, "string -- %s\n", buf); 253c19800e8SDoug Rabson yylval.name = estrdup(buf); 254c19800e8SDoug Rabson return STRING; 255c19800e8SDoug Rabson } 256c19800e8SDoug Rabson 257c19800e8SDoug Rabson -?0x[0-9A-Fa-f]+|-?[0-9]+ { char *e, *y = yytext; 258*1b748759SDimitry Andric yylval.constant = strtoll((const char *)yytext, 2594137ff4cSJacques Vidrine &e, 0); 2604137ff4cSJacques Vidrine if(e == y) 261ae771770SStanislav Sedov lex_error_message("malformed constant (%s)", yytext); 2624137ff4cSJacques Vidrine else 263c19800e8SDoug Rabson return NUMBER; 2644137ff4cSJacques Vidrine } 2654137ff4cSJacques Vidrine [A-Za-z][-A-Za-z0-9_]* { 266c19800e8SDoug Rabson yylval.name = estrdup ((const char *)yytext); 267c19800e8SDoug Rabson return IDENTIFIER; 2684137ff4cSJacques Vidrine } 269b528cefcSMark Murray [ \t] ; 2705e9cd1aeSAssar Westerlund \n { ++lineno; } 271c19800e8SDoug Rabson \.\.\. { return ELLIPSIS; } 272c19800e8SDoug Rabson \.\. { return RANGE; } 273ae771770SStanislav Sedov . { lex_error_message("Ignoring char(%c)\n", *yytext); } 274b528cefcSMark Murray %% 275b528cefcSMark Murray 276b528cefcSMark Murray #ifndef yywrap /* XXX */ 277b528cefcSMark Murray int 278b528cefcSMark Murray yywrap () 279b528cefcSMark Murray { 280b528cefcSMark Murray return 1; 281b528cefcSMark Murray } 282b528cefcSMark Murray #endif 283b528cefcSMark Murray 284b528cefcSMark Murray void 285ae771770SStanislav Sedov lex_error_message (const char *format, ...) 286b528cefcSMark Murray { 287b528cefcSMark Murray va_list args; 288b528cefcSMark Murray 289b528cefcSMark Murray va_start (args, format); 290c19800e8SDoug Rabson fprintf (stderr, "%s:%d: ", get_filename(), lineno); 291b528cefcSMark Murray vfprintf (stderr, format, args); 292b528cefcSMark Murray va_end (args); 293c19800e8SDoug Rabson error_flag++; 294c19800e8SDoug Rabson } 295c19800e8SDoug Rabson 296c19800e8SDoug Rabson static void 297c19800e8SDoug Rabson unterminated(const char *type, unsigned start_lineno) 298c19800e8SDoug Rabson { 299ae771770SStanislav Sedov lex_error_message("unterminated %s, possibly started on line %d\n", type, start_lineno); 300b528cefcSMark Murray } 301