1 /* $OpenBSD: yylex.c,v 1.6 2015/11/19 19:43:40 tedu 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 36 #include <ctype.h> 37 #include "flexdef.h" 38 #include "parse.h" 39 40 41 /* yylex - scan for a regular expression token */ 42 43 int yylex () 44 { 45 int toktype; 46 static int beglin = false; 47 extern char *yytext; 48 49 if (eofseen) 50 toktype = EOF; 51 else 52 toktype = flexscan (); 53 54 if (toktype == EOF || toktype == 0) { 55 eofseen = 1; 56 57 if (sectnum == 1) { 58 synerr (_("premature EOF")); 59 sectnum = 2; 60 toktype = SECTEND; 61 } 62 63 else 64 toktype = 0; 65 } 66 67 if (trace) { 68 if (beglin) { 69 fprintf (stderr, "%d\t", num_rules + 1); 70 beglin = 0; 71 } 72 73 switch (toktype) { 74 case '<': 75 case '>': 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 (void) putc (toktype, stderr); 95 break; 96 97 case '\n': 98 (void) putc ('\n', stderr); 99 100 if (sectnum == 2) 101 beglin = 1; 102 103 break; 104 105 case SCDECL: 106 fputs ("%s", stderr); 107 break; 108 109 case XSCDECL: 110 fputs ("%x", stderr); 111 break; 112 113 case SECTEND: 114 fputs ("%%\n", stderr); 115 116 /* We set beglin to be true so we'll start 117 * writing out numbers as we echo rules. 118 * flexscan() has already assigned sectnum. 119 */ 120 if (sectnum == 2) 121 beglin = 1; 122 123 break; 124 125 case NAME: 126 fprintf (stderr, "'%s'", nmstr); 127 break; 128 129 case CHAR: 130 switch (yylval) { 131 case '<': 132 case '>': 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 fprintf (stderr, "\\%c", yylval); 152 break; 153 154 default: 155 if (!isascii (yylval) || !isprint (yylval)) 156 fprintf (stderr, 157 "\\%.3o", 158 (unsigned int) yylval); 159 else 160 (void) putc (yylval, stderr); 161 break; 162 } 163 164 break; 165 166 case NUMBER: 167 fprintf (stderr, "%d", yylval); 168 break; 169 170 case PREVCCL: 171 fprintf (stderr, "[%d]", yylval); 172 break; 173 174 case EOF_OP: 175 fprintf (stderr, "<<EOF>>"); 176 break; 177 178 case OPTION_OP: 179 fprintf (stderr, "%s ", yytext); 180 break; 181 182 case OPT_OUTFILE: 183 case OPT_PREFIX: 184 case CCE_ALNUM: 185 case CCE_ALPHA: 186 case CCE_BLANK: 187 case CCE_CNTRL: 188 case CCE_DIGIT: 189 case CCE_GRAPH: 190 case CCE_LOWER: 191 case CCE_PRINT: 192 case CCE_PUNCT: 193 case CCE_SPACE: 194 case CCE_UPPER: 195 case CCE_XDIGIT: 196 fprintf (stderr, "%s", yytext); 197 break; 198 199 case 0: 200 fprintf (stderr, _("End Marker\n")); 201 break; 202 203 default: 204 fprintf (stderr, 205 _ 206 ("*Something Weird* - tok: %d val: %d\n"), 207 toktype, yylval); 208 break; 209 } 210 } 211 212 return toktype; 213 } 214