Annotation of src/usr.bin/compile_et/et_lex.lex.l, Revision 1.6
1.1 downsj 1: %{
1.3 hin 2: /*
1.6 ! biorn 3: * Copyright (c) 1998 - 2000 Kungliga Tekniska Högskolan
1.3 hin 4: * (Royal Institute of Technology, Stockholm, Sweden).
5: * All rights reserved.
6: *
7: * Redistribution and use in source and binary forms, with or without
8: * modification, are permitted provided that the following conditions
9: * are met:
10: *
11: * 1. Redistributions of source code must retain the above copyright
12: * notice, this list of conditions and the following disclaimer.
13: *
14: * 2. Redistributions in binary form must reproduce the above copyright
15: * notice, this list of conditions and the following disclaimer in the
16: * documentation and/or other materials provided with the distribution.
17: *
1.6 ! biorn 18: * 3. Neither the name of the Institute nor the names of its contributors
1.3 hin 19: * may be used to endorse or promote products derived from this software
20: * without specific prior written permission.
21: *
22: * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
23: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25: * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
26: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
27: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
28: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
29: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
31: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32: * SUCH DAMAGE.
33: */
34:
35: /*
36: * This is to handle the definition of this symbol in some AIX
37: * headers, which will conflict with the definition that lex will
38: * generate for it. It's only a problem for AIX lex.
39: */
40:
41: #undef ECHO
42:
43: #include "compile_et.h"
44: #include "error_table.h"
45:
1.6 ! biorn 46: /* RCSID("$KTH: lex.l,v 1.8 2005/05/16 08:52:54 lha Exp $"); */
1.3 hin 47:
48: static unsigned lineno = 1;
1.6 ! biorn 49: void error_message(const char *, ...);
! 50: static int getstring(void);
! 51:
! 52: #define YY_NO_UNPUT
! 53:
! 54: #undef ECHO
1.3 hin 55:
1.1 downsj 56: %}
57:
1.3 hin 58:
59: %%
60: et { return ET; }
61: error_table { return ET; }
62: ec { return EC; }
63: error_code { return EC; }
64: prefix { return PREFIX; }
65: index { return INDEX; }
66: id { return ID; }
67: end { return END; }
68: [0-9]+ { yylval.number = atoi(yytext); return NUMBER; }
69: #[^\n]* ;
70: [ \t] ;
71: \n { lineno++; }
72: \" { return getstring(); }
73: [a-zA-Z0-9_]+ { yylval.string = strdup(yytext); return STRING; }
74: . { return *yytext; }
1.1 downsj 75: %%
76:
1.3 hin 77: #ifndef yywrap /* XXX */
78: int
79: yywrap ()
80: {
81: return 1;
82: }
83: #endif
1.1 downsj 84:
1.6 ! biorn 85: static int
1.3 hin 86: getstring(void)
87: {
88: char x[128];
89: int i = 0;
90: int c;
91: int quote = 0;
1.5 jaredy 92: while(i < sizeof(x) - 1 && (c = input()) != EOF){
1.3 hin 93: if(quote) {
94: x[i++] = c;
95: quote = 0;
96: continue;
97: }
98: if(c == '\n'){
99: error_message("unterminated string");
100: lineno++;
101: break;
102: }
103: if(c == '\\'){
104: quote++;
105: continue;
106: }
107: if(c == '\"')
108: break;
109: x[i++] = c;
110: }
111: x[i] = '\0';
1.6 ! biorn 112: yylval.string = strdup(x);
! 113: if (yylval.string == NULL)
! 114: err(1, "malloc");
1.3 hin 115: return STRING;
116: }
117:
118: void
1.6 ! biorn 119: error_message (const char *format, ...)
1.3 hin 120: {
121: va_list args;
122:
123: va_start (args, format);
124: fprintf (stderr, "%s:%d:", filename, lineno);
125: vfprintf (stderr, format, args);
126: va_end (args);
127: numerror++;
128: }