Skip to content

Instantly share code, notes, and snippets.

@irwansyahwii
Last active November 14, 2021 10:20
Show Gist options
  • Star 3 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save irwansyahwii/bd73992820fca52af9c9ed8ade3d9a53 to your computer and use it in GitHub Desktop.
Save irwansyahwii/bd73992820fca52af9c9ed8ade3d9a53 to your computer and use it in GitHub Desktop.
PlantUML Grammar
statement -> element_expr:*  {% id %}
	| null {% id %}

element_expr -> actor_expr {% id %}
	| boundary_expr  {% id %}
	| call_expr {% id %}
	| participant_expr {% id %}


actor_expr -> ACTOR {% d => d[0] %}
	| ACTOR _ ELEMENT_COLOR {% d => [ d[0][0], d[0][1], d[2] ] %}
	| ACTOR _ ELEMENT_ORDER {% d => [ d[0][0], d[0][1], d[2] ] %}
	| ACTOR _ ELEMENT_COLOR _ ELEMENT_ORDER
	| ACTOR _ ELEMENT_ORDER _ ELEMENT_COLOR 
	
boundary_expr -> BOUNDARY  {% d => d[0] %}
	| BOUNDARY _ ELEMENT_COLOR {% d => [ d[0][0], d[0][1], d[2] ] %}
	| BOUNDARY _ ELEMENT_ORDER {% d => [ d[0][0], d[0][1], d[2] ] %}
	| BOUNDARY _ ELEMENT_COLOR _ ELEMENT_ORDER
	| BOUNDARY _ ELEMENT_ORDER _ ELEMENT_COLOR 

participant_expr -> PARTICIPANT {% d => d[0] %}
	| PARTICIPANT _ ELEMENT_COLOR {% d => [ d[0][0], d[0][1], d[2] ] %}
	| PARTICIPANT _ ELEMENT_ORDER {% d => [ d[0][0], d[0][1], d[2] ] %}
	| PARTICIPANT _ ELEMENT_COLOR _ ELEMENT_ORDER
	| PARTICIPANT _ ELEMENT_ORDER _ ELEMENT_COLOR 

call_expr -> CALL {% d => d[0] %}

id -> STRING  {% d => ["IDENTIFIER", d[0][1] ] %}
	| dqstring  {% d => ["IDENTIFIER", d[0] ] %}
integer -> INT {% id %}

CALL_ARROW -> CALL_ARROW_BODY CALL_ARROW_HEAD CALL_ARROW_HEAD_MODIFIER
		| CALL_ARROW_BODY CALL_ARROW_HEAD
		| CALL_ARROW_HEAD_MODIFIER CALL_ARROW_HEAD CALL_ARROW_BODY
		
		
		
CALL_ARROW_BODY -> "-"
			| "--"
			| "->"
			| "<-"
			
CALL_ARROW_HEAD -> ">"
			| "<"
			| "\\"
			| "\\\\"
			| "/"
			
CALL_ARROW_HEAD_MODIFIER -> "x"
			| ">"
			| "<"
			| "\\"
			| "/"
			| "o"
			
CALL -> id _ CALL_ARROW _ id _ ":" _ MESSAGE_NAME _ {% d => ["CALL", d[0], d[4], d[7]] %}
ACTOR -> "actor" _ id _ {% d => ["ACTOR", d[2] ] %}
BOUNDARY -> "boundary" _ id _ {% d => ["BOUNDARY", d[2] ] %}
PARTICIPANT -> "participant" _ id _ {% d => ["PARTICIPANT", d[2] ] %}
ELEMENT_ORDER -> "order" _ INT _ {% d => ["ELEMENT_ORDER", d[2] ] %}
MESSAGE_NAME -> dstrchar:* {% d => ["MESSAGE_NAME", d[0].join('')] %}		
ELEMENT_COLOR -> "#" STRING _ {% d => ["ELEMENT_COLOR", d[1][1] ] %}

INT -> [0-9]:+ {% d => ["INT", d[0][0]] %}
STRING -> [a-zA-Z]:+ {% d => ["STRING", d[0].join('')] %}
STRINGW -> [a-zA-Z ]:+ {% d => ["STRING", d[0].join('')] %}
WHITESPACE -> _

_  -> wschar:* {% function(d) {return null;} %}
__ -> wschar:+ {% function(d) {return null;} %}

wschar -> [ \t\n\v\f] {% id %}

# Matches various kinds of string literals

# Double-quoted string
dqstring -> "\"" dstrchar:* "\"" {% function(d) {return d[1].join(""); } %}
sqstring -> "'"  sstrchar:* "'"  {% function(d) {return d[1].join(""); } %}
btstring -> "`"  [^`]:*    "`"  {% function(d) {return d[1].join(""); } %}

dstrchar -> [^\\"\n] {% id %}
    | "\\" strescape {%
    function(d) {
        return JSON.parse("\""+d.join("")+"\"");
    }
%}

sstrchar -> [^\\'\n] {% id %}
    | "\\" strescape
        {% function(d) { return JSON.parse("\""+d.join("")+"\""); } %}
    | "\\'"
        {% function(d) {return "'"; } %}

strescape -> ["\\/bfnrt] {% id %}
    | "u" [a-fA-F0-9] [a-fA-F0-9] [a-fA-F0-9] [a-fA-F0-9] {%
    function(d) {
        return d.join("");
    }
%}
@suprafun
Copy link

suprafun commented Oct 7, 2020

Hello, under what license is this gist released under ? I would like to study it to learn from it. Thank you.

@irwansyahwii
Copy link
Author

@suprafun feel free to use it in your project

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment