1 /* $NetBSD: yylex.c,v 1.2 2016/01/09 17:38:57 christos Exp $ */ 2 3 /* yylex - scanner front-end for flex */ 4 5 /* Copyright (c) 1990 The Regents of the University of California. */ 6 /* All rights reserved. */ 7 8 /* This code is derived from software contributed to Berkeley by */ 9 /* Vern Paxson. */ 10 11 /* The United States Government has rights in this work pursuant */ 12 /* to contract no. DE-AC03-76SF00098 between the United States */ 13 /* Department of Energy and the University of California. */ 14 15 /* This file is part of flex. */ 16 17 /* Redistribution and use in source and binary forms, with or without */ 18 /* modification, are permitted provided that the following conditions */ 19 /* are met: */ 20 21 /* 1. Redistributions of source code must retain the above copyright */ 22 /* notice, this list of conditions and the following disclaimer. */ 23 /* 2. Redistributions in binary form must reproduce the above copyright */ 24 /* notice, this list of conditions and the following disclaimer in the */ 25 /* documentation and/or other materials provided with the distribution. */ 26 27 /* Neither the name of the University nor the names of its contributors */ 28 /* may be used to endorse or promote products derived from this software */ 29 /* without specific prior written permission. */ 30 31 /* THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR */ 32 /* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED */ 33 /* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR */ 34 /* PURPOSE. */ 35 #include "flexdef.h" 36 __RCSID("$NetBSD: yylex.c,v 1.2 2016/01/09 17:38:57 christos Exp $"); 37 38 #include <ctype.h> 39 #include "flexdef.h" 40 #include "parse.h" 41 42 43 /* yylex - scan for a regular expression token */ 44 45 extern char *yytext; 46 int yylex (void) 47 { 48 int toktype; 49 static int beglin = false; 50 51 if (eofseen) 52 toktype = EOF; 53 else 54 toktype = flexscan (); 55 56 if (toktype == EOF || toktype == 0) { 57 eofseen = 1; 58 59 if (sectnum == 1) { 60 synerr (_("premature EOF")); 61 sectnum = 2; 62 toktype = SECTEND; 63 } 64 65 else 66 toktype = 0; 67 } 68 69 if (trace) { 70 if (beglin) { 71 fprintf (stderr, "%d\t", num_rules + 1); 72 beglin = 0; 73 } 74 75 switch (toktype) { 76 case '<': 77 case '>': 78 case '^': 79 case '$': 80 case '"': 81 case '[': 82 case ']': 83 case '{': 84 case '}': 85 case '|': 86 case '(': 87 case ')': 88 case '-': 89 case '/': 90 case '\\': 91 case '?': 92 case '.': 93 case '*': 94 case '+': 95 case ',': 96 (void) putc (toktype, stderr); 97 break; 98 99 case '\n': 100 (void) putc ('\n', stderr); 101 102 if (sectnum == 2) 103 beglin = 1; 104 105 break; 106 107 case SCDECL: 108 fputs ("%s", stderr); 109 break; 110 111 case XSCDECL: 112 fputs ("%x", stderr); 113 break; 114 115 case SECTEND: 116 fputs ("%%\n", stderr); 117 118 /* We set beglin to be true so we'll start 119 * writing out numbers as we echo rules. 120 * flexscan() has already assigned sectnum. 121 */ 122 if (sectnum == 2) 123 beglin = 1; 124 125 break; 126 127 case NAME: 128 fprintf (stderr, "'%s'", nmstr); 129 break; 130 131 case CHAR: 132 switch (yylval) { 133 case '<': 134 case '>': 135 case '^': 136 case '$': 137 case '"': 138 case '[': 139 case ']': 140 case '{': 141 case '}': 142 case '|': 143 case '(': 144 case ')': 145 case '-': 146 case '/': 147 case '\\': 148 case '?': 149 case '.': 150 case '*': 151 case '+': 152 case ',': 153 fprintf (stderr, "\\%c", yylval); 154 break; 155 156 default: 157 if (!isascii (yylval) || !isprint (yylval)) { 158 if(trace_hex) 159 fprintf (stderr, "\\x%02x", (unsigned int) yylval); 160 else 161 fprintf (stderr, "\\%.3o", (unsigned int) yylval); 162 } else 163 (void) putc (yylval, stderr); 164 break; 165 } 166 167 break; 168 169 case NUMBER: 170 fprintf (stderr, "%d", yylval); 171 break; 172 173 case PREVCCL: 174 fprintf (stderr, "[%d]", yylval); 175 break; 176 177 case EOF_OP: 178 fprintf (stderr, "<<EOF>>"); 179 break; 180 181 case OPTION_OP: 182 fprintf (stderr, "%s ", yytext); 183 break; 184 185 case OPT_OUTFILE: 186 case OPT_PREFIX: 187 case CCE_ALNUM: 188 case CCE_ALPHA: 189 case CCE_BLANK: 190 case CCE_CNTRL: 191 case CCE_DIGIT: 192 case CCE_GRAPH: 193 case CCE_LOWER: 194 case CCE_PRINT: 195 case CCE_PUNCT: 196 case CCE_SPACE: 197 case CCE_UPPER: 198 case CCE_XDIGIT: 199 fprintf (stderr, "%s", yytext); 200 break; 201 202 case 0: 203 fprintf (stderr, _("End Marker\n")); 204 break; 205 206 default: 207 fprintf (stderr, 208 _ 209 ("*Something Weird* - tok: %d val: %d\n"), 210 toktype, yylval); 211 break; 212 } 213 } 214 215 return toktype; 216 } 217