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