--- /dev/null
+options {\r
+ JDK_VERSION = "1.6";\r
+ STATIC = false;\r
+ IGNORE_CASE = true;\r
+}\r
+\r
+PARSER_BEGIN(DotParser)\r
+package org.simantics.graphviz.internal.parser;\r
+\r
+import org.simantics.graphviz.*;\r
+import java.util.Map;\r
+import java.util.HashMap;\r
+\r
+public class DotParser {\r
+ AbstractAttributeContainer defaultNode = new AbstractAttributeContainer();\r
+ AbstractAttributeContainer defaultEdge = new AbstractAttributeContainer();\r
+ Map<String,Identifiable> connectors = new HashMap<String,Identifiable>();\r
+ \r
+}\r
+PARSER_END(DotParser)\r
+\r
+/*** Lexer *********************************************************/\r
+\r
+SKIP:\r
+{ <WHITESPACE: " " | "\n" | "\r" | "\t" > \r
+| <COMMENT1: "/*" (~["*"] | "*" ~["/"])* "*/" > \r
+| <COMMENT2: "//" (~["\n"])* >\r
+}\r
+\r
+TOKEN:\r
+{ "=" | "->" | "--" | ":" | "{" | "}" | "[" | "]" | "," \r
+| "subgraph" | "digraph" | "graph" | "node" | "edge" | "strict" | ";"\r
+| <STRING: "\"" (~["\"", "\\"] | "\\" ~[])* "\"">\r
+ { matchedToken.image = matchedToken.image.substring(1,matchedToken.image.length()-1); }\r
+| <HTML: "<" (~["<",">"] | "<" (~["<",">","\""] | "\"" (~["\"", "\\"] | "\\" ~[])* "\"")* ">" )* ">">\r
+| <IDENT: ["a"-"z","A"-"Z","_"] (["a"-"z","A"-"Z","_",":","0"-"9"])* >\r
+| <NUMBER: ("-")?("." (["0"-"9"])+ |(["0"-"9"])+ ("." (["0"-"9"])*)?) >\r
+}\r
+\r
+/*** Parser ********************************************************/\r
+\r
+Graph document() : { Graph graph = new Graph(); }\r
+{ ("strict")? ("graph" | "digraph") "{" (statement(graph))* "}" <EOF> { return graph; }\r
+}\r
+\r
+void statement(IGraph graph) : {}\r
+{ { String id1, id2; }\r
+ id1=id() ( LOOKAHEAD(1) \r
+ { Node node = new Node(graph); connectors.put(id1, node); } attributes(node) \r
+ | "->" id2=id() { \r
+ Edge edge = new Edge(connectors.get(id1.split(":")[0]), \r
+ connectors.get(id2.split(":")[0])); \r
+ } attributes(edge)\r
+ ) \r
+| "graph" attributes(graph)\r
+| "node" attributes(defaultNode)\r
+| "edge" attributes(defaultEdge)\r
+| { Subgraph subgraph; String id; } \r
+ "subgraph" id=id() { subgraph = new Subgraph(graph); connectors.put(id, subgraph); } \r
+ "{" (statement(subgraph))* "}"\r
+}\r
+\r
+void attributes(IAttributeContainer el) : {}\r
+{ ("[" attribute(el) ( (",")? attribute(el) )* "]")? ";" {}\r
+}\r
+\r
+void attribute(IAttributeContainer el) : { String key, value=""; }\r
+{ key=id() ("=" value=id())? { el.set(key, value); }\r
+}\r
+\r
+String id() : {}\r
+{ <NUMBER> { return token.image; }\r
+| <STRING> { return token.image; }\r
+| <IDENT> { return token.image; }\r
+| <HTML> { return token.image; }\r
+}
\ No newline at end of file