1/*	$NetBSD: scan.l,v 1.18 2019/02/25 20:47:37 martin Exp $	*/
2
3/*
4 * Copyright 1997 Piermont Information Systems Inc.
5 * All rights reserved.
6 *
7 * Written by Philip A. Nelson for Piermont Information Systems Inc.
8 *
9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted provided that the following conditions
11 * are met:
12 * 1. Redistributions of source code must retain the above copyright
13 *    notice, this list of conditions and the following disclaimer.
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 * 3. The name of Piermont Information Systems Inc. may not be used to endorse
18 *    or promote products derived from this software without specific prior
19 *    written permission.
20 *
21 * THIS SOFTWARE IS PROVIDED BY PIERMONT INFORMATION SYSTEMS INC. ``AS IS''
22 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24 * ARE DISCLAIMED. IN NO EVENT SHALL PIERMONT INFORMATION SYSTEMS INC. BE
25 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
26 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
27 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
28 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
29 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
30 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
31 * THE POSSIBILITY OF SUCH DAMAGE.
32 *
33 */
34
35%{
36/* scan.l: scanner description for menu compiler. */
37
38#include <stdio.h>
39#include <string.h>
40#include "defs.h"
41#include "parse.h"
42
43static int level; 	/* For nested comments. */
44static int comstart;	/* line number of comment start. */
45
46%}
47
48%x COMMENT
49%x BRACE
50
51%option noinput
52
53%%
54
55[ \t]+	{ /* ignore spaces and tabs */ }
56
57[\n]	{ line_no++; }
58
59"="|";"|","|"("|")"	{ return (int)yytext[0]; }
60
61x	{ return X; }
62
63y	{ return Y; }
64
65w	{ return W; }
66
67h	{ return H; }
68
69no	{ return NO; }
70
71box	{ return BOX; }
72
73continuous { return CONTINUOUS; }
74
75sub	{ return SUB; }
76
77help	{ return HELP; }
78
79menu	{ return MENU; }
80
81menus	{ return MENUS; }
82
83next	{ return NEXT; }
84
85exit	{ return  EXIT; }
86
87exitstring { return  EXITSTRING; }
88
89title	{ return TITLE; }
90
91action	{ return ACTION; }
92
93endwin	{ return ENDWIN; }
94
95option	{ return OPTION; }
96
97default { return DEFAULT; }
98
99display { return DISPLAY; }
100
101expand { return EXPAND; }
102
103error { return ERROR; }
104
105allow { return ALLOW; }
106
107dynamic { return DYNAMIC; }
108
109messages { return MESSAGES; }
110
111scrollable { return SCROLLABLE; }
112
113shortcut { return SHORTCUT; }
114
115clear { return CLEAR; }
116
117always { return ALWAYS; }
118
119scroll { return SCROLL; }
120
121\"([^\"\n]*(\\\")?)*\"  {
122	  yylval.s_value = strdup (yytext);
123	  max_strlen = max_strlen > strlen(yytext)
124		       ? max_strlen : strlen(yytext) + 1;
125	  return STRING;
126	}
127
128[a-zA-Z][a-zA-Z0-9_]* {
129	  yylval.s_value = strdup(yytext);
130	  return(NAME);
131	}
132
1330|[-1-9][0-9]* {
134	  yylval.s_value = strdup(yytext);
135	  return(INT_CONST);
136	}
137
138"'"[^'\\]|(\\[athrn])|(\\[0-9][0-9]?[0-9]?)"'" {
139	  yylval.s_value = strdup(yytext);
140	  return(CHAR_CONST);
141	}
142
143"/*"  {	level = 1; comstart = line_no; BEGIN COMMENT; }
144
145<COMMENT>"/*" { level++; }
146
147<COMMENT>"*/" { if (level-- == 1) BEGIN 0; }
148
149<COMMENT>"\n" { line_no++; }
150
151<COMMENT><<EOF>> {
152		yyerror ("EOF inside a comment that started at line %d",
153			 comstart);
154		exit (1);
155	}
156
157<COMMENT>.  {/* eat character */}
158
159"{"	{ level = 1; BEGIN BRACE; }
160
161<BRACE>"{"	{ buff_add_ch(yytext[0]); level++; }
162
163<BRACE>"}"	{ if (level-- == 1)  {
164			BEGIN 0;
165			yylval.s_value = buff_copy();
166			return CODE;
167		  } else
168			buff_add_ch (yytext[0]);
169		}
170
171<BRACE>"\n"	{ buff_add_ch (yytext[0]); line_no++; }
172
173<BRACE>.	{ buff_add_ch (yytext[0]); }
174
175.       {
176	  if (yytext[0] < ' ')
177	    yyerror ("illegal character: ^%c",yytext[0] + '@');
178	  else
179	    if (yytext[0] > '~')
180	      yyerror ("illegal character: \\%3d", (int) yytext[0]);
181	    else
182	      yyerror ("illegal character: %s",yytext);
183
184	  /* To quiet the compiler */
185	  if (0) unput(0);
186	}
187%%
188
189#ifdef SCAN
190YYSTYPE yylval;
191
192main()
193{
194  int val;
195
196  line_no = 1;
197  while ( (val = yylex()) != 0 )
198    printf ("val = %d\n yytext = %s\n", val, yytext);
199}
200#endif
201