|
|
1.1 ! root 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) 5/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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.