expression-parser.l revision 88b635b84d831b109f0807922449fa7a900f5dbd
188b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron%{
288b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron
388b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron/*
488b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron * (C) Copyright 2014, Stephen M. Cameron.
588b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron *
688b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron *  This program is free software; you can redistribute it and/or modify
788b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron *  it under the terms of the GNU General Public License version 2 as
888b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron *  published by the Free Software Foundation.
988b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron *
1088b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron *  This program is distributed in the hope that it will be useful,
1188b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron *  but WITHOUT ANY WARRANTY; without even the implied warranty of
1288b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1388b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron *  GNU General Public License for more details.
1488b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron *
1588b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron *  You should have received a copy of the GNU General Public License
1688b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron *  along with this program; if not, write to the Free Software
1788b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
1888b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron *
1988b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron */
2088b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron
2188b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron#include <stdio.h>
2288b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron#include <string.h>
2388b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron#include "y.tab.h"
2488b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron
2588b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron#define YYSTYPE PARSER_VALUE_TYPE
2688b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron
2788b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameronextern int lexer_input(char* buffer, int *nbytes, int buffersize);
2888b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron
2988b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron#undef YY_INPUT
3088b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron#define YY_INPUT(buffer, bytes_read, bytes_requested) \
3188b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron		lexer_input((buffer), &(bytes_read), (bytes_requested))
3288b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron
3388b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameronextern int yyerror(long long *result, double *dresult,
3488b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron		int *has_error, int *bye, const char *msg);
3588b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron
3688b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameronstatic void __attribute__((unused)) yyunput(int c,char *buf_ptr);
3788b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameronstatic int __attribute__((unused)) input(void);
3888b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron
3988b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron%}
4088b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron
4188b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron%%
4288b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron
4388b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron
4488b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameronbye	return BYE;
4588b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron[ \t] ; /* ignore whitespace */
4688b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron#.+ ; /* ignore comments */
4788b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron[0-9]*[.][0-9]+ {
4888b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron			int rc;
4988b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron			double dval;
5088b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron
5188b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron			rc = sscanf(yytext, "%lf", &dval);
5288b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron			if (rc == 1) {
5388b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron				yylval.v.dval = dval;
5488b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron				yylval.v.ival = (long long) dval;
5588b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron				yylval.v.has_dval = 1;
5688b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron				yylval.v.has_error = 0;
5788b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron				return NUMBER;
5888b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron			} else {
5988b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron				yyerror(0, 0, 0, 0, "bad number\n");
6088b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron				yylval.v.has_error = 1;
6188b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron				return NUMBER;
6288b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron			}
6388b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron		}
6488b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron0x[0-9a-fA-F]+ {
6588b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron		int rc, intval;
6688b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron		rc = sscanf(yytext, "%x", &intval);
6788b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron		if (rc == 1) {
6888b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron			yylval.v.ival = intval;
6988b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron			yylval.v.dval = (double) intval;
7088b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron			yylval.v.has_dval = 0;
7188b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron			yylval.v.has_error = 0;
7288b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron			return NUMBER;
7388b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron		} else {
7488b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron			yyerror(0, 0, 0, 0, "bad number\n");
7588b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron			yylval.v.has_error = 1;
7688b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron			return NUMBER;
7788b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron		}
7888b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron	}
7988b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron[0-9]+	{
8088b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron		int rc, intval;
8188b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron		rc = sscanf(yytext, "%d", &intval);
8288b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron		if (rc == 1) {
8388b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron			yylval.v.ival = intval;
8488b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron			yylval.v.dval = (double) intval;
8588b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron			yylval.v.has_dval = 0;
8688b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron			yylval.v.has_error = 0;
8788b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron			return NUMBER;
8888b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron		} else {
8988b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron			yyerror(0, 0, 0, 0, "bad number\n");
9088b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron			yylval.v.has_error = 1;
9188b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron			return NUMBER;
9288b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron		}
9388b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron	}
9488b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron\n	return 0;
9588b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron[+-/*()]	return yytext[0];
9688b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron.	{
9788b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron		yylval.v.has_error = 1;
9888b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron		return NUMBER;
9988b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron	}
10088b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron%%
10188b635b84d831b109f0807922449fa7a900f5dbdStephen M. Cameron
102