1 %{ 2 3 /* 4 * Copyright (c) 1980 Regents of the University of California. 5 * All rights reserved. 6 * 7 * Redistribution and use in source and binary forms are permitted 8 * provided that the above copyright notice and this paragraph are 9 * duplicated in all such forms and that any documentation, 10 * advertising materials, and other materials related to such 11 * distribution and use acknowledge that the software was developed 12 * by the University of California, Berkeley. The name of the 13 * University may not be used to endorse or promote products derived 14 * from this software without specific prior written permission. 15 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR 16 * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED 17 * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. 18 * 19 * @(#)lang.l 5.6 (Berkeley) 05/16/90 20 */ 21 22 #include <ctype.h> 23 #include "y.tab.h" 24 #include "config.h" 25 26 #define tprintf if (do_trace) printf 27 28 /* 29 * Key word table 30 */ 31 32 struct kt { 33 char *kt_name; 34 int kt_val; 35 } key_words[] = { 36 { "and", AND }, 37 { "args", ARGS }, 38 { "at", AT }, 39 { "config", CONFIG }, 40 { "controller", CONTROLLER }, 41 { "cpu", CPU }, 42 { "csr", CSR }, 43 { "device", DEVICE }, 44 { "disk", DISK }, 45 { "drive", DRIVE }, 46 { "dst", DST }, 47 { "dumps", DUMPS }, 48 { "flags", FLAGS }, 49 { "hz", HZ }, 50 { "ident", IDENT }, 51 { "machine", MACHINE }, 52 { "major", MAJOR }, 53 { "makeoptions", MAKEOPTIONS }, 54 { "master", MASTER }, 55 { "maxusers", MAXUSERS }, 56 { "minor", MINOR }, 57 { "nexus", NEXUS }, 58 { "on", ON }, 59 { "options", OPTIONS }, 60 { "priority", PRIORITY }, 61 { "pseudo-device",PSEUDO_DEVICE }, 62 { "root", ROOT }, 63 #if MACHINE_HP300 64 { "scode", NEXUS }, 65 #endif 66 { "size", SIZE }, 67 { "slave", SLAVE }, 68 { "swap", SWAP }, 69 { "tape", DEVICE }, 70 { "timezone", TIMEZONE }, 71 { "trace", TRACE }, 72 { "vector", VECTOR }, 73 { 0, 0 }, 74 }; 75 %} 76 WORD [A-Za-z_][-A-Za-z_]* 77 %% 78 {WORD} { 79 int i; 80 81 if ((i = kw_lookup(yytext)) == -1) 82 { 83 yylval.str = yytext; 84 tprintf("id(%s) ", yytext); 85 return ID; 86 } 87 tprintf("(%s) ", yytext); 88 return i; 89 } 90 \"[^"]+\" { 91 yytext[strlen(yytext)-1] = '\0'; 92 yylval.str = yytext + 1; 93 return ID; 94 } 95 0[0-7]* { 96 yylval.val = octal(yytext); 97 tprintf("#O:%o ", yylval.val); 98 return NUMBER; 99 } 100 0x[0-9a-fA-F]+ { 101 yylval.val = hex(yytext); 102 tprintf("#X:%x ", yylval.val); 103 return NUMBER; 104 } 105 [1-9][0-9]* { 106 yylval.val = atoi(yytext); 107 tprintf("#D:%d ", yylval.val); 108 return NUMBER; 109 } 110 [0-9]"."[0-9]* { 111 double atof(); 112 yylval.val = (int) (60 * atof(yytext) + 0.5); 113 return FPNUMBER; 114 } 115 "-" { 116 return MINUS; 117 } 118 "?" { 119 yylval.val = -1; 120 tprintf("? "); 121 return NUMBER; 122 } 123 \n/[ \t] { 124 yyline++; 125 tprintf("\n... "); 126 } 127 \n { 128 yyline++; 129 tprintf("\n"); 130 return SEMICOLON; 131 } 132 #.* { /* Ignored (comment) */; } 133 [ \t]* { /* Ignored (white space) */; } 134 ";" { return SEMICOLON; } 135 "," { return COMMA; } 136 "=" { return EQUALS; } 137 "@" { return AT; } 138 . { return yytext[0]; } 139 140 %% 141 /* 142 * kw_lookup 143 * Look up a string in the keyword table. Returns a -1 if the 144 * string is not a keyword otherwise it returns the keyword number 145 */ 146 147 kw_lookup(word) 148 register char *word; 149 { 150 register struct kt *kp; 151 152 for (kp = key_words; kp->kt_name != 0; kp++) 153 if (eq(word, kp->kt_name)) 154 return kp->kt_val; 155 return -1; 156 } 157 158 /* 159 * Number conversion routines 160 */ 161 162 octal(str) 163 char *str; 164 { 165 int num; 166 167 (void) sscanf(str, "%o", &num); 168 return num; 169 } 170 171 hex(str) 172 char *str; 173 { 174 int num; 175 176 (void) sscanf(str+2, "%x", &num); 177 return num; 178 } 179