7 PARSER_BEGIN(DotParser)
\r
8 package org.simantics.graphviz.internal.parser;
\r
10 import org.simantics.graphviz.*;
\r
11 import java.util.Map;
\r
12 import java.util.HashMap;
\r
14 public class DotParser {
\r
15 AbstractAttributeContainer defaultNode = new AbstractAttributeContainer();
\r
16 AbstractAttributeContainer defaultEdge = new AbstractAttributeContainer();
\r
17 Map<String,Identifiable> connectors = new HashMap<String,Identifiable>();
\r
20 PARSER_END(DotParser)
\r
22 /*** Lexer *********************************************************/
\r
25 { <WHITESPACE: " " | "\n" | "\r" | "\t" >
\r
26 | <COMMENT1: "/*" (~["*"] | "*" ~["/"])* "*/" >
\r
27 | <COMMENT2: "//" (~["\n"])* >
\r
31 { "=" | "->" | "--" | ":" | "{" | "}" | "[" | "]" | ","
\r
32 | "subgraph" | "digraph" | "graph" | "node" | "edge" | "strict" | ";"
\r
33 | <STRING: "\"" (~["\"", "\\"] | "\\" ~[])* "\"">
\r
34 { matchedToken.image = matchedToken.image.substring(1,matchedToken.image.length()-1); }
\r
35 | <HTML: "<" (~["<",">"] | "<" (~["<",">","\""] | "\"" (~["\"", "\\"] | "\\" ~[])* "\"")* ">" )* ">">
\r
36 | <IDENT: ["a"-"z","A"-"Z","_"] (["a"-"z","A"-"Z","_",":","0"-"9"])* >
\r
37 | <NUMBER: ("-")?("." (["0"-"9"])+ |(["0"-"9"])+ ("." (["0"-"9"])*)?) >
\r
40 /*** Parser ********************************************************/
\r
42 Graph document() : { Graph graph = new Graph(); }
\r
43 { ("strict")? ("graph" | "digraph") "{" (statement(graph))* "}" <EOF> { return graph; }
\r
46 void statement(IGraph graph) : {}
\r
47 { { String id1, id2; }
\r
48 id1=id() ( LOOKAHEAD(1)
\r
49 { Node node = new Node(graph); connectors.put(id1, node); } attributes(node)
\r
51 Edge edge = new Edge(connectors.get(id1.split(":")[0]),
\r
52 connectors.get(id2.split(":")[0]));
\r
55 | "graph" attributes(graph)
\r
56 | "node" attributes(defaultNode)
\r
57 | "edge" attributes(defaultEdge)
\r
58 | { Subgraph subgraph; String id; }
\r
59 "subgraph" id=id() { subgraph = new Subgraph(graph); connectors.put(id, subgraph); }
\r
60 "{" (statement(subgraph))* "}"
\r
63 void attributes(IAttributeContainer el) : {}
\r
64 { ("[" attribute(el) ( (",")? attribute(el) )* "]")? ";" {}
\r
67 void attribute(IAttributeContainer el) : { String key, value=""; }
\r
68 { key=id() ("=" value=id())? { el.set(key, value); }
\r
72 { <NUMBER> { return token.image; }
\r
73 | <STRING> { return token.image; }
\r
74 | <IDENT> { return token.image; }
\r
75 | <HTML> { return token.image; }
\r