%{ /* * 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 "Edge.h" %} %code requires { #import "TikzGraphAssembler+Parser.h" #import "GraphElementData.h" #import "GraphElementProperty.h" #import "Node.h" struct noderef { Node *node; NSString *anchor; }; } %defines "common/tikzparser.h" %pure-parser %parse-param {TikzGraphAssembler *assembler} %error-verbose %union { NSPoint pt; NSString *nsstr; GraphElementProperty *prop; GraphElementData *data; Node *node; struct noderef noderef; }; %{ #import "tikzlexer.h" %} %token BEGIN_TIKZPICTURE_CMD "\\begin{tikzpicture}" %token END_TIKZPICTURE_CMD "\\end{tikzpicture}" %token BEGIN_PGFONLAYER_CMD "\\begin{pgfonlayer}" %token END_PGFONLAYER_CMD "\\end{pgfonlayer}" %token DRAW_CMD "\\draw" %token NODE_CMD "\\node" %token PATH_CMD "\\path" %token RECTANGLE "rectangle" %token NODE "node" %token AT "at" %token TO "to" %token SEMICOLON ";" %token COMMA "," %token LEFTPARENTHESIS "(" %token RIGHTPARENTHESIS ")" %token LEFTBRACKET "[" %token RIGHTBRACKET "]" %token FULLSTOP "." %token EQUALS "=" %token COORD "co-ordinate" %token PROPSTRING "key/value string" %token REFSTRING "string" %token DELIMITEDSTRING "{-delimited string" %type nodename %type optanchor %type val %type property %type extraproperties %type properties %type optproperties %type optedgenode %type noderef %type optnoderef %% tikzpicture: "\\begin{tikzpicture}" optproperties tikzcmds "\\end{tikzpicture}"; tikzcmds: tikzcmds tikzcmd | ; tikzcmd: node | edge | boundingbox | ignore; ignore: "\\begin{pgfonlayer}" DELIMITEDSTRING | "\\end{pgfonlayer}"; optproperties: "[" properties "]" { $$ = $2; } | { $$ = nil; }; properties: property extraproperties { [$2 addObject:$1]; $$ = $2; }; extraproperties: "," property extraproperties { [$3 addObject:$2]; $$ = $3; } | { $$ = [GraphElementData data]; }; property: val "=" val { $$ = [GraphElementProperty property:$1 withValue:$3]; } | val { $$ = [GraphElementProperty atom:$1]; }; val: PROPSTRING { $$ = $1; } | DELIMITEDSTRING { $$ = $1; }; nodename: "(" REFSTRING ")" { $$ = $2; }; node: "\\node" optproperties nodename "at" COORD DELIMITEDSTRING ";" { Node *node = [Node node]; [node setData:$2]; [node setName:$3]; [node setPoint:$5]; [node setLabel:$6]; [assembler addNodeToMap:node]; [[assembler graph] addNode:node]; }; optanchor: { $$ = nil; } | "." REFSTRING { $$ = $2; }; noderef: "(" REFSTRING optanchor ")" { $$.node = [assembler nodeWithName:$2]; $$.anchor = $3; }; optnoderef: noderef { $$ = $1; } | "(" ")" { $$.node = nil; $$.anchor = nil; } optedgenode: { $$ = nil; } | "node" optproperties DELIMITEDSTRING { $$ = [Node node]; [$$ setData:$2]; [$$ setLabel:$3]; } edge: "\\draw" optproperties noderef "to" optedgenode optnoderef ";" { Edge *edge = [Edge edge]; [edge setData:$2]; [edge setSource:$3.node]; [edge setSourceAnchor:$3.anchor]; [edge setEdgeNode:$5]; if ($6.node) { [edge setTarget:$6.node]; [edge setTargetAnchor:$6.anchor]; } else { [edge setTarget:$3.node]; [edge setTargetAnchor:$3.anchor]; } [edge setAttributesFromData]; [[assembler graph] addEdge:edge]; }; ignoreprop: val | val "=" val; ignoreprops: ignoreprop ignoreprops | ; optignoreprops: "[" ignoreprops "]"; boundingbox: "\\path" optignoreprops COORD "rectangle" COORD ";" { [[assembler graph] setBoundingBox:NSRectAroundPoints($3, $5)]; }; /* vi:ft=yacc:noet:ts=4:sts=4:sw=4 */