mermaid/src/parser/flow.jison

197 lines
4.0 KiB
Plaintext
Raw Normal View History

2014-11-12 07:35:44 +01:00
/* description: Parses end executes mathematical expressions. */
/* lexical grammar */
%lex
%%
"style" return 'STYLE';
"graph" return 'GRAPH';
"LR" return 'DIR';
"TD" return 'DIR';
2014-11-12 07:35:44 +01:00
\#[a-f0-9]+ return 'HEX';
[0-9]+ return 'NUM';
\# return 'BRKT';
2014-11-12 07:35:44 +01:00
"px" return 'UNIT';
"pt" return 'UNIT';
"dot" return 'UNIT';
":" return 'COLON';
";" return 'SEMI';
2014-11-12 07:35:44 +01:00
"," return 'COMMA';
"=" return 'EQUALS';
"*" return 'MULT';
"." return 'DOT';
"<" return 'TAGSTART';
">" return 'TAGEND';
\-\-[x] return 'ARROW_CROSS';
\-\-\> return 'ARROW_POINT';
2014-11-16 09:20:46 +01:00
\-\-[o] return 'ARROW_CIRCLE';
\-\-\- return 'ARROW_OPEN';
2014-11-16 09:20:46 +01:00
\- return 'MINUS';
\+ return 'PLUS';
\= return 'EQUALS';
[a-zåäöæøA-ZÅÄÖÆØ_]+ return 'ALPHA';
2014-11-12 07:35:44 +01:00
"|" return 'PIPE';
"(" return 'PS';
")" return 'PE';
"[" return 'SQS';
"]" return 'SQE';
"{" return 'DIAMOND_START'
"}" return 'DIAMOND_STOP'
\s return 'SPACE';
\n return 'NEWLINE';
<<EOF>> return 'EOF';
/lex
/* operator associations and precedence */
%left '^'
%start expressions
%% /* language grammar */
expressions
: graphConfig statements EOF
| graphConfig spaceList statements EOF
{$$=$1;}
2014-11-12 07:35:44 +01:00
;
graphConfig
: GRAPH SPACE DIR SEMI
2014-11-16 19:00:01 +01:00
{ yy.setDirection($3);$$ = $3;}
;
statements
: statements spaceList statement
| statement
;
spaceList
: SPACE spaceList
| SPACE
;
statement
: verticeStatement SEMI
| styleStatement SEMI
;
verticeStatement:
| vertex link vertex
2014-11-16 19:00:01 +01:00
{ yy.addLink($1,$3,$2);$$ = 'oy'}
| vertex
2014-11-16 19:00:01 +01:00
{$$ = 'yo';}
;
vertex: alphaNum SQS text SQE
{$$ = $1;yy.addVertex($1,$3,'square');}
| alphaNum PS text PE
{$$ = $1;yy.addVertex($1,$3,'round');}
| alphaNum DIAMOND_START text DIAMOND_STOP
{$$ = $1;yy.addVertex($1,$3,'diamond');}
| alphaNum
2014-11-16 19:00:01 +01:00
{$$ = $1;yy.addVertex($1);}
;
alphaNum
2014-11-16 09:20:46 +01:00
: alphaNumStatement
{$$=$1;}
2014-11-16 09:20:46 +01:00
| alphaNumStatement alphaNum
{$$=$1+''+$2;}
;
2014-11-16 09:20:46 +01:00
alphaNumStatement
: alphaNumToken
2014-11-16 19:00:01 +01:00
{$$=$1;}
2014-11-16 09:20:46 +01:00
| alphaNumToken MINUS alphaNumToken
{$$=$1+'-'+$3;}
;
alphaNumToken
: ALPHA
{$$=$1;}
| NUM
{$$=$1;}
| COLON
{$$ = $1;}
| COMMA
{$$ = $1;}
| PLUS
{$$ = $1;}
| EQUALS
{$$ = $1;}
| MULT
{$$ = $1;}
| DOT
{$$ = $1;}
| TAGSTART
{$$ = $1;}
| TAGEND
{$$ = $1;}
;
link: linkStatement arrowText
{$1.text = $2;$$ = $1;}
| linkStatement
{$$ = $1;}
;
2014-11-16 09:02:03 +01:00
linkStatement: ARROW_POINT
{$$ = {"type":"arrow"};}
2014-11-16 09:02:03 +01:00
| ARROW_CIRCLE
{$$ = {"type":"arrow_circle"};}
2014-11-16 09:02:03 +01:00
| ARROW_CROSS
{$$ = {"type":"arrow_cross"};}
2014-11-16 09:02:03 +01:00
| ARROW_OPEN
{$$ = {"type":"arrow_open"};}
;
arrowText:
PIPE text PIPE
2014-11-16 19:00:01 +01:00
{$$ = $2;}
;
// Characters and spaces
text: alphaNum SPACE text
{$$ = $1 + ' ' +$3;}
2014-11-16 19:00:01 +01:00
| alphaNum spaceList MINUS spaceList text
{$$ = $1 + ' - ' +$5;}
| alphaNum
{$$ = $1;}
;
styleStatement:STYLE SPACE alphaNum SPACE stylesOpt
{$$ = $1;yy.addVertex($3,undefined,undefined,$5);}
| STYLE SPACE HEX SPACE stylesOpt
2014-11-16 19:00:01 +01:00
{$$ = $1;yy.updateLink($3,$5);}
;
stylesOpt: style
{$$ = [$1]}
| stylesOpt COMMA style
{$1.push($3);$$ = $1;}
;
style: styleComponent
2014-11-12 07:35:44 +01:00
{$$=$1;}
|style styleComponent
{$$ = $1 + $2;}
2014-11-12 07:35:44 +01:00
;
styleComponent: ALPHA
{$$=$1}
| COLON
{$$=$1}
| MINUS
{$$=$1}
| NUM
{$$=$1}
| UNIT
{$$=$1}
| SPACE
{$$=$1}
| HEX
{$$=$1}
;
2014-11-16 19:00:01 +01:00
%%