diff options
Diffstat (limited to 'tksao/frame/proslex.L')
-rw-r--r-- | tksao/frame/proslex.L | 192 |
1 files changed, 192 insertions, 0 deletions
diff --git a/tksao/frame/proslex.L b/tksao/frame/proslex.L new file mode 100644 index 0000000..d607cad --- /dev/null +++ b/tksao/frame/proslex.L @@ -0,0 +1,192 @@ +/* Copyright (C) 1999-2016 + * Smithsonian Astrophysical Observatory, Cambridge, MA, USA + * For conditions of distribution and use, see copyright notice in "copyright" + */ + +%option noyywrap +%option caseless +%option never-interactive +%option c++ + +%{ + #include <stdio.h> + #include <stdlib.h> + #include <string.h> + + #include "util.h" + #include "prosparser.H" + + extern YYSTYPE* proslval; + extern prosFlexLexer* proslexx; +%} + +%x DISCARD + +D [0-9] +E [Ee][+-]?{D}+ + +/* rules */ + +%% + +<DISCARD>[\n] { // special case-- #\n + BEGIN INITIAL; + yyless(0); // put back the terminator + strcpy(proslval->str,""); // feed a blank string + return STRING; + } + +<DISCARD>[^\n]* { // Discard reset of line + BEGIN INITIAL; + int ll = yyleng <(PROSBUFSIZE-1) ? yyleng:(PROSBUFSIZE-1); + strncpy(proslval->str,yytext,ll); + proslval->str[ll] = '\0'; + return STRING; + } + +annulus {return ANNULUS_;} +b1950 {return B1950_;} +box {return BOX_;} +circle {return CIRCLE_;} +debug {return DEBUG_;} +ellipse {return ELLIPSE_;} +ecliptic {return ECLIPTIC_;} +equatorial {return EQUATORIAL_;} +galactic {return GALACTIC_;} +j2000 {return J2000_;} +logical {return LOGICAL_;} +n {return N_;} +off {return OFF_;} +on {return ON_;} +physical {return PHYSICAL_;} +point {return POINT_;} +polygon {return POLYGON_;} +rotbox {return ROTBOX_;} +version {return VERSION_;} + +[+-]?{D}+ { // Integer + proslval->integer = atoi(yytext); + return INT; + } + +[+-]?{D}+"."?({E})? | +[+-]?{D}*"."{D}+({E})? { // Real Number + proslval->real = atof(yytext); + return REAL; + } + +[+-]?{D}+"."?d | +[+-]?{D}*"."{D}+d { // degrees + yytext[yyleng-1] = '\0'; + proslval->real = atof(yytext); + return ANGDEGREE; + } + +[+-]?{D}+"."?r | +[+-]?{D}*"."{D}+r { // radians + yytext[yyleng-1] = '\0'; + proslval->real = atof(yytext); + return ANGRADIAN; + } + +{D}+"."?' | +{D}*"."{D}+' | +[+-]?{D}+"."?({E})?' | +[+-]?{D}*"."{D}+({E})?' { // minutes of arc + yytext[yyleng-1] = '\0'; + proslval->real = atof(yytext); + return ARCMINUTE; + } + +{D}+"."?\" | +{D}*"."{D}+\" | +[+-]?{D}+"."?({E})?\" | +[+-]?{D}*"."{D}+({E})?\" { // seconds of arc + yytext[yyleng-1] = '\0'; + proslval->real = atof(yytext); + return ARCSECOND; + } + +[+-]?{D}+:{D}+:{D}+"."? | +[+-]?{D}+:{D}+:{D}*"."{D}+ { // Sexagesimal + int ll = yyleng <(PROSBUFSIZE-1) ? yyleng:(PROSBUFSIZE-1); + strncpy(proslval->str,yytext,ll); + proslval->str[ll] = '\0'; + return SEXSTR; + } + +[+-]?{D}+h{D}+m{D}+"."?s | +[+-]?{D}+h{D}+m{D}*"."{D}+s { // HMS + int ll = yyleng <(PROSBUFSIZE-1) ? yyleng:(PROSBUFSIZE-1); + strncpy(proslval->str,yytext,ll); + proslval->str[ll] = '\0'; + return HMSSTR; + } + +[+-]?{D}+d{D}+m{D}+"."?s | +[+-]?{D}+d{D}+m{D}*"."{D}+s { // DMS + int ll = yyleng <(PROSBUFSIZE-1) ? yyleng:(PROSBUFSIZE-1); + strncpy(proslval->str,yytext,ll); + proslval->str[ll] = '\0'; + return DMSSTR; + } + +\"[^\"\n]*\" | +\'[^\'\n]*\' { // Quoted String + int ll=(yyleng-2)<(PROSBUFSIZE-1)?(yyleng-2):(PROSBUFSIZE-1); + strncpy(proslval->str,yytext+1,ll); // skip the " " + proslval->str[ll] = '\0'; // Remove the '"' + return STRING; + } + +\{[^\}\n]*\} { // Quoted String + int ll=(yyleng-2)<(PROSBUFSIZE-1)?(yyleng-2):(PROSBUFSIZE-1); + strncpy(proslval->str,yytext+1,ll); // skip the '{' + proslval->str[ll] = '\0'; // Remove the '}' + return STRING; + } + +[0-9A-Za-z]+ { // General String + int ll = yyleng <(PROSBUFSIZE-1) ? yyleng:(PROSBUFSIZE-1); + strncpy(proslval->str,yytext,ll); + proslval->str[ll] = '\0'; + return STRING; + } + +[ \t]+ { // White Spaces + } + +\r\n { // windows line feed + return '\n'; + } + +\\n { // fake line feed + return '\n'; + } + +\n { // linefeed + return '\n'; + } + +<<EOF>> { // eof + return EOF_; + } + +. { // Else, return the char + return yytext[0]; + } + +%% + +void prosDiscard(int doit) +{ + if (proslexx) + proslexx->begin(DISCARD, doit); +} + +void prosFlexLexer::begin(int which, int doit) +{ + BEGIN which; + if (doit) + yyless(0); +} |