diff options
Diffstat (limited to 'libs/cassowary/ClReader.l')
-rw-r--r-- | libs/cassowary/ClReader.l | 87 |
1 files changed, 87 insertions, 0 deletions
diff --git a/libs/cassowary/ClReader.l b/libs/cassowary/ClReader.l new file mode 100644 index 0000000000..77fa13a5a1 --- /dev/null +++ b/libs/cassowary/ClReader.l @@ -0,0 +1,87 @@ +/* $Id$ + Cassowary Incremental Constraint Solver + Original Smalltalk Implementation by Alan Borning + This C++ Implementation by Greg J. Badros, <gjb@cs.washington.edu> + http://www.cs.washington.edu/homes/gjb + (C) 1998, 1999 Greg J. Badros and Alan Borning + See ../LICENSE for legal details regarding this software + + ClReader.l - Scanner for constraint parsing. + By Greg J. Badros + */ + +%{ +/* Get the token numbers that bison created for us + (uses the -d option of bison) */ + +#include <cassowary/ClReader.h> +#include "ClReader.cc.h" + +#ifdef HAVE_CONFIG_H +#include <config.h> +#define CONFIG_H_INCLUDED +#endif + +/* global variable for the istream we are reading from; + gets set by PcnParseConstraint */ +istream *pxi_lexer; + +/* Pass in an extra variable (ClParseData *) to cllex so that + it can look up variable names */ +#define YY_DECL int cllex(YYSTYPE *lvalp, void *YYLEX_PARAM) + +/* Make lexer reader from the global variable */ +#define YY_INPUT(buf,result,max_size) \ + do { if (pxi_lexer->get(buf[0]) && buf[0] > 0) result = 1; \ + else result = YY_NULL; } while (0) + +%} + +%option noyywrap + +DIGIT [0-9] +ALPHA [A-Za-z] +ALPHANUM [A-Za-z0-9] +ID_OK_PUNC [-_\[\]] +RO_ANNOTATION "?" +ID {ALPHA}({ALPHANUM}|{ID_OK_PUNC})*({RO_ANNOTATION})? +NUMID "{"{DIGIT}+"}" +ws [ \t\n]+ + +%% +{ws} /* skip whitespace */ +\n|";" { return 0; } +">=" { return GEQ; } +">" { return GT; } +"<=" { return LEQ; } +"<" { return LT; } +"==" { return '='; } +"="|"-"|"+"|"*"|"/"|"("|")" { return yytext[0]; } + +{DIGIT}+("."{DIGIT}*)? | +"."{DIGIT}+ { lvalp->num = strtod(yytext,0); return NUM; } + +{ID} { /* Lookup the variable name */ + ClParseData *pclpd = ((ClParseData *) YYLEX_PARAM); + int cch = strlen(yytext); + ClVariable *pclv = NULL; + bool fReadOnly = false; + if (yytext[cch-1] == '?') { + yytext[cch-1] = '\0'; + fReadOnly = true; + } + const string str = string(yytext); + pclv = pclpd->_lookup_func(str); + if (!pclv->IsNil()) { + lvalp->pclv = pclv; + return fReadOnly?RO_VAR:VAR; + } else { + pxi_lexer = NULL; + yy_flush_buffer(YY_CURRENT_BUFFER); + throw ExCLParseErrorBadIdentifier(str); + return 0; + } + } + +. { pxi_lexer = NULL; throw ExCLParseErrorMisc("Unrecognized character"); } + |