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