module Dot
rascal-0.33.7
Usage
import lang::dot::\syntax::Dot;
syntax DOT
start syntax DOT = LAYOUT* Graph Id "{" StatementList "}" "\n"?;
syntax Reserved
keyword Reserved = "graph"|"digraph"|"node"|"edge"|"subgraph";
syntax Graph
syntax Graph = "graph"|"digraph"|AttrTag;
syntax AttrTag
syntax AttrTag = "node"|"edge"|"graph";
syntax Nod
syntax Nod = NodeId|Subgraph;
syntax Id
lexical Id = ([A-Z a-z 0-9 _] !<< [A-Z a-z 0-9 _]+ !<< [a-z A-Z 0-9 _][a-z A-Z 0-9 _]* !>> [0-9 A-Z _ a-z]) \ Reserved
| [\"] (![\"] | "\\\"")* [\"]
| [\-]? "." [0-9]+
| [\-]? [0-9]+ "." [0-9]*
;
syntax StatementList
syntax StatementList = StatementOptional*;
syntax Statement
syntax Statement = NodeStatement
|EdgeStatement
|AttrStatement
>Id "=" Id
;
syntax StatementOptional
syntax StatementOptional = Statement ";"?;
syntax NodeStatement
syntax NodeStatement = Nod AttrList;
syntax EdgeStatement
syntax EdgeStatement = Nod EdgeRhs AttrList ;
syntax Edg
syntax Edg = EdgeOp Nod;
syntax EdgeOp
syntax EdgeOp = "-\>" | "--";
syntax EdgeRhs
syntax EdgeRhs = Edg+;
syntax NodeId
syntax NodeId = Id
| Id Port
;
syntax Port
syntax Port = ":" Id Id?
// | ":" Id
// | ":" CompassPt
;
syntax AttrList
syntax AttrList = AttrList0*;
syntax AttrList0
syntax AttrList0 = "[" DotAttr* "]";
syntax DotAttr
syntax DotAttr = Id "=" Id | Id "=" Id "," ;
syntax AttrStatement
syntax AttrStatement = AttrTag AttrList;
syntax Subgraph
syntax Subgraph = ("subgraph" Id? )? "{" StatementList "}";
syntax Comment
lexical Comment = "/*" (![*] | [*] !>> "/")* "*/"
| "//" ![\n]* $
;
syntax LAYOUTLIST
layout LAYOUTLIST = LAYOUT* !>> [\ \t\n\r] !>> "//" !>> "/*"
;
syntax LAYOUT
lexical LAYOUT = Whitespace: [\ \t\n\r]
| @category="Comment" Comment
;