%{ /* * 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 #import "tikzparser.h" #define YY_USER_ACTION \ yylloc->first_line = yylloc->last_line; \ if (yylloc->last_line != 1 || yylloc->last_column != 1) \ yylloc->first_column = yylloc->last_column + 1; \ yylloc->last_column = yylloc->first_column + yyleng; %} %option reentrant bison-bridge bison-locations 8bit %option nounput %option yylineno %option noyywrap %option header-file="common/tikzlexer.h" %s props %s xcoord %s ycoord %s noderef FLOAT \-?[0-9]*(\.[0-9]+)? %% \n { yylloc->first_line += 1; yylloc->last_line = yylloc->first_line; yylloc->first_column = yylloc->last_column = 0; } [ ]+ { } /* ignore whitespace */; [\t]+ { // tab = 8 columns // note that we have already adjusted by yyleng at this point yylloc->last_column = yylloc->first_column + 7*yyleng; } \\begin\{tikzpicture\} { return BEGIN_TIKZPICTURE_CMD; } \\end\{tikzpicture\} { return END_TIKZPICTURE_CMD; } \\begin\{pgfonlayer\} { return BEGIN_PGFONLAYER_CMD; } \\end\{pgfonlayer\} { return END_PGFONLAYER_CMD; } \\draw { return DRAW_CMD; } \\node { return NODE_CMD; } \\path { return PATH_CMD; } rectangle { return RECTANGLE; } node { return NODE; } at { return AT; } to { return TO; } ; { return SEMICOLON; } \([ ]*{FLOAT}[ ]*,[ ]*{FLOAT}[ ]*\) { yylloc->last_column = yylloc->first_column + 1; yyless(1); BEGIN(xcoord); } {FLOAT} { yylval->pt.x=(float)strtod(yytext,NULL); BEGIN(ycoord); } , { } {FLOAT} { yylval->pt.y=(float)strtod(yytext,NULL); } \) { BEGIN(INITIAL); return COORD; } /* when we see "[", change parsing mode */ \[ /*syntaxhlfix]*/ { BEGIN(props); return LEFTBRACKET; } = { return EQUALS; } , { return COMMA; } [^=,\{\] \t]([^=,\{\]]*[^=,\{\] \t])? { yylval->nsstr=[NSString stringWithUTF8String:yytext]; return PROPSTRING; } \] { BEGIN(INITIAL); return RIGHTBRACKET; } \( { BEGIN(noderef); return LEFTPARENTHESIS; } \. { return FULLSTOP; } [^\.\{\)]+ { yylval->nsstr=[NSString stringWithUTF8String:yytext]; return REFSTRING; } \) { BEGIN(INITIAL); return RIGHTPARENTHESIS; } \{ { NSMutableString *buf = [NSMutableString string]; unsigned int brace_depth = 1; unsigned int escape = 0; while (1) { char c = input(yyscanner); // eof reached before closing brace if (c == '\0' || c == EOF) { return UNCLOSED_DELIM_STR; } yylloc->last_column += 1; yyleng += 1; if (escape) { escape = 0; } else if (c == '\\') { escape = 1; } else if (c == '{') { brace_depth++; } else if (c == '}') { brace_depth--; if (brace_depth == 0) break; } else if (c == '\n') { yylloc->last_line += 1; yylloc->last_column = 0; } [buf appendFormat:@"%c", c]; } NSString *s = [buf copy]; [s autorelease]; yylval->nsstr = s; return DELIMITEDSTRING; } \\begin { return UNKNOWN_BEGIN_CMD; } \\end { return UNKNOWN_END_CMD; } \\[a-zA-Z]+[a-zA-Z0-9]* { return UNKNOWN_CMD; } . { return UNKNOWN_STR; } /* vi:ft=lex:noet:ts=4:sts=4:sw=4: */