%option nounput %option yylineno %s props %s xcoord %s ycoord %s noderef FLOAT \-?[0-9]*(\.[0-9]+)? %{ /* * Copyright 2010 Chris Heunen * Copyright 2010-2013 Aleks Kissinger * Copyright 2013 K. Johan Paulsson * Copyright 2013 Alex Merry * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of * the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #import #ifdef __APPLE__ #include "y.tab.h" #else #include "tikzparser.h" #endif extern char linebuff[500]; extern int lineno; extern int tokenpos; %} %% %\n /* ignore end of line */; \n.* { strncpy(linebuff, yytext+1, 500); linebuff[499] = 0; // ensure null-terminated lineno++; tokenpos = 0; yyless(1); } [ ]+ { tokenpos += yyleng; } /* ignore whitespace */; [\t]+ { tokenpos += 8*yyleng; } /* ignore whitespace */; \\begin\{tikzpicture\} { tokenpos += yyleng; return BEGIN_TIKZPICTURE_CMD; } \\end\{tikzpicture\} { tokenpos += yyleng; return END_TIKZPICTURE_CMD; } \\begin\{pgfonlayer\} { tokenpos += yyleng; return BEGIN_PGFONLAYER_CMD; } \\end\{pgfonlayer\} { tokenpos += yyleng; return END_PGFONLAYER_CMD; } \\draw { tokenpos += yyleng; return DRAW_CMD; } \\node { tokenpos += yyleng; return NODE_CMD; } \\path { tokenpos += yyleng; return PATH_CMD; } rectangle { tokenpos += yyleng; return RECTANGLE; } node { tokenpos += yyleng; return NODE; } at { tokenpos += yyleng; return AT; } to { tokenpos += yyleng; return TO; } ; { tokenpos += yyleng; return SEMICOLON; } \([ ]*{FLOAT}[ ]*,[ ]*{FLOAT}[ ]*\) { tokenpos += 1; yyless(1); BEGIN(xcoord); } {FLOAT} { tokenpos += yyleng; yylval.pt.x=(float)strtod(yytext,NULL); BEGIN(ycoord); } , { tokenpos += yyleng; } {FLOAT} { tokenpos += yyleng; yylval.pt.y=(float)strtod(yytext,NULL); } \) { tokenpos += yyleng; BEGIN(INITIAL); return COORD; } /* when we see "[", change parsing mode */ \[ /*syntaxhlfix]*/ { tokenpos += yyleng; BEGIN(props); return LEFTBRACKET; } = { tokenpos += yyleng; return EQUALS; } , { tokenpos += yyleng; return COMMA; } [^=,\{\] \t]([^=,\{\]]*[^=,\{\] \t])? { tokenpos += yyleng; yylval.nsstr=[NSString stringWithUTF8String:yytext]; return PROPSTRING; } \] { tokenpos += yyleng; BEGIN(INITIAL); return RIGHTBRACKET; } \( { tokenpos += yyleng; BEGIN(noderef); return LEFTPARENTHESIS; } \. { tokenpos += yyleng; return FULLSTOP; } [^\.\{\)]+ { tokenpos += yyleng; yylval.nsstr=[NSString stringWithUTF8String:yytext]; return REFSTRING; } \) { tokenpos += yyleng; BEGIN(INITIAL); return RIGHTPARENTHESIS; } \{ { NSMutableString *buf = [NSMutableString string]; unsigned int brace_depth = 1; unsigned int escape = 0; while (1) { char c = input(); // eof reached before closing brace if (c == '\0' || c == EOF) yyterminate(); if (escape) { escape = 0; } else if (c == '\\') { escape = 1; } else if (c == '{') { brace_depth++; } else if (c == '}') { brace_depth--; if (brace_depth == 0) break; } [buf appendFormat:@"%c", c]; } NSString *s = [buf copy]; yyleng += 1 + [buf length]; [s autorelease]; yylval.nsstr = s; tokenpos += yyleng; return DELIMITEDSTRING; } /* vi:ft=lex:noet:ts=4:sts=4:sw=4: */