JS 实现UML序列图 (二)-- csdn MarkDown 第七篇 技术篇

上一篇大概说了一下JS是怎么画UML 图形的。

这一篇简单介绍一下这个JS 解析 UML语法是怎么实现的。

https://github.com/bramp/js-sequence-diagrams/blob/master/src/grammar.ebnf

这个是Markdown UML语言的语法结构。摘抄了部分:

这一部分是将词和词组成语句。而语句和语句就组成篇章。

document ::= statement*
statement ::=
( ‘title‘ ‘:‘ message
| ‘participant‘ actor
| ‘note‘ (‘left of‘ | ‘right of‘ | ‘over‘) actor ‘:‘ message
| actor ( ‘-‘ | ‘--‘ ) ( ‘>‘ | ‘>>‘ )? actor ‘:‘ message
)

这里的意思是 UML是由 statement(语句)构成的。

statement有下面几种表示方法:

1. ‘title’ ‘:’ message 这里带上”的都是token,在编译原理中,token标识不能再被解释的词。

2. ‘participant’ actor

3. ‘note’ (‘left of’ | ‘right of’ | ‘over’) actor ‘:’ message 表示note与Actor之间的关系

4. actor ( ‘-’ | ‘–’ ) ( ‘>’ | ‘>>’ )? actor ‘:’ message 标识actor之间的关系。

下面的词法分析会将字符转换为UML中有含义的字。类似字符组成词。用正则式将字母变成有含义的词。

/** js sequence diagrams
 *  http://bramp.github.io/js-sequence-diagrams/
 *  (c) 2012-2013 Andrew Brampton (bramp.net)
 *  Simplified BSD license.
 */
%lex

%options case-insensitive

%{
    // Pre-lexer code can go here
%}

%%

[\n]+             return ‘NL‘;
\s+               /* skip whitespace */
\#[^\n]*          /* skip comments */
"participant"     return ‘participant‘;
"left of"         return ‘left_of‘;
"right of"        return ‘right_of‘;
"over"            return ‘over‘;
"note"            return ‘note‘;
"title"           return ‘title‘;
","               return ‘,‘;
[^\->:\n,]+       return ‘ACTOR‘;
"--"              return ‘DOTLINE‘;
"-"               return ‘LINE‘;
">>"              return ‘OPENARROW‘;
">"               return ‘ARROW‘;
:[^#\n]+          return ‘MESSAGE‘;
<<EOF>>           return ‘EOF‘;
.                 return ‘INVALID‘;

/lex

%start start

%% /* language grammar */

start
    : document ‘EOF‘ { return yy; }
    ;

document
    : /* empty */
    | document line
    ;

line
    : statement { }
    | ‘NL‘
    ;

statement
    : ‘participant‘ actor  { $2; }
    | signal               { yy.addSignal($1); }
    | note_statement       { yy.addSignal($1); }
    | ‘title‘ message      { yy.setTitle($2);  }
    ;

note_statement
    : ‘note‘ placement actor message   { $$ = new Diagram.Note($3, $2, $4); }
	| ‘note‘ ‘over‘ actor_pair message { $$ = new Diagram.Note($3, Diagram.PLACEMENT.OVER, $4); }
    ;

actor_pair
    : actor             { $$ = $1; }
	| actor ‘,‘ actor   { $$ = [$1, $3]; }
    ;

placement
    : ‘left_of‘   { $$ = Diagram.PLACEMENT.LEFTOF; }
	| ‘right_of‘  { $$ = Diagram.PLACEMENT.RIGHTOF; }
    ;

signal
    : actor signaltype actor message
    { $$ = new Diagram.Signal($1, $2, $3, $4); }
    ;

actor
    : ACTOR { $$ = yy.getActor($1); }
    ;

signaltype
    : linetype arrowtype  { $$ = $1 | ($2 << 2); }
	| linetype            { $$ = $1; }
    ;

linetype
    : LINE      { $$ = Diagram.LINETYPE.SOLID; }
	| DOTLINE   { $$ = Diagram.LINETYPE.DOTTED; }
    ;

arrowtype
    : ARROW     { $$ = Diagram.ARROWTYPE.FILLED; }
	| OPENARROW { $$ = Diagram.ARROWTYPE.OPEN; }
    ;

message
    : MESSAGE { $$ = $1.substring(1).trim().replace(/\\n/gm, "\n"); }
    ;

%%

例如下面这一句:

[^\->:\n,]+       return ‘ACTOR‘;

就是将不是“->:\n,” 这些字符的多个字组成词,这个词叫做ACTOR.

一般来说终结符也就是类似’note’ 这样的字符需要先被定义。否则 ‘note’这样的字符集合就变成了markdown UML的ACTOR.

而下面的是将ACTOR词转成对象actor。

actor
    : ACTOR { $$ = yy.getActor($1); }
    ;
    ```sequence
        A->B: 一句话证明你很寂寞。
        Note left of A: thinking
        B->B: counting
        B>>A: 这句话有一共六十九笔
        Note right of X: SB
    ```

Created with Rapha?l 2.1.2寂寞是什么AACCSSBB一句话证明你很寂寞。thinkingcounting这句话有一共六十九笔SB

好吧上面就是UML的grammar. 其实用什么语言都可以写出来。不局限于JS. 具体grammar这块使用的是jison和ebnf. 有闲空的人可以看一下JS调用jison来做js parser以及EBNF表达式。

时间: 2024-12-14 18:42:28

JS 实现UML序列图 (二)-- csdn MarkDown 第七篇 技术篇的相关文章

csdn MarkDown 第六篇 技术篇--UML 序列图 实现

这一篇开始讨论代码层面的问题.主要是markdown的功能的设计实现. 这一篇先从markdown外围的代码开始讲起: UML序列图是从https://github.com/bramp/js-sequence-diagrams copy得到的. 当如这个UML代码还用到了两个JS,功能库和画图. <script src="underscore-min.js"></script> <script src="raphael-min.js"&

UML序列图总结

原文:UML序列图总结 序列图主要用于展示对象之间交互的顺序. 序列图将交互关系表示为一个二维图.纵向是时间轴,时间沿竖线向下延伸.横向轴代表了在协作中各独立对象的类元角色.类元角色用生命线表示.当对象存在时,角色用一条虚线表示,当对象的过程处于激活状态时,生命线是一个双道线. 消息用从一个对象的生命线到另一个对象生命线的箭头表示.箭头以时间顺序在图中从上到下排列. 序列图中涉及的元素: 1.   生命线: 生命线名称可带下划线.当使用下划线时,意味着序列图中的生命线代表一个类的特定实体. 2.

CSDN-Markdown编辑器之UML序列图

这里以"TCP协议中的三次握手"来讲一下Markdown编辑器中UML序列图的应用. 连接建立的过程: ```sequence Title:连接建立的过程 客户主机->服务器主机: 连接请求(SYN=1,seq=client_isn) 服务器主机->客户主机: 授予连接(SYN=1,seq=client_isn)\n ack=client_isn+1 客户主机->服务器主机: 确认(SYN=0,seq=client_isn+1)\nack=server_isn+1 `

【UML】UML序列图总结

序列图主要用于展示对象之间交互的顺序. 序列图将交互关系表示为一个二维图. 纵向是时间轴,时间沿竖线向下延伸. 横向轴代表了在协作中各独立对象的类元角色. 类元角色用生命线表示. 当对象存在时,角色用一条虚线表示,当对象的过程处于激活状态时,生命线是一个双道线. 消息用从一个对象的生命线到另一个对象生命线的箭头表示. 箭头以时间顺序在图中从上到下排列. 序列图中涉及的元素: 1. 生命线 生命线名称可带下划线.当使用下划线时,意味着序列图中的生命线代表一个类的特定实体. 2.     同步消息

UML序列图总结(Loop、Opt、Par和Alt)

序列图主要用于展示对象之间交互的顺序. 序列图将交互关系表示为一个二维图.纵向是时间轴,时间沿竖线向下延伸.横向轴代表了在协作中各独立对象的类元角色.类元角色用生命线表示.当对象存在时,角色用一条虚线表示,当对象的过程处于激活状态时,生命线是一个双道线. 消息用从一个对象的生命线到另一个对象生命线的箭头表示.箭头以时间顺序在图中从上到下排列. 序列图中涉及的元素: 1. 生命线: 生命线名称可带下划线.当使用下划线时,意味着序列图中的生命线代表一个类的特定实例. 2. 同步消息 发送人在它继续之

UML序列图总结(转)

序列图主要用于展示对象之间交互的顺序. 序列图将交互关系表示为一个二维图.纵向是时间轴,时间沿竖线向下延伸.横向轴代表了在协作中各独立对象的类元角色.类元角色用生命线表示.当对象存在时,角色用一条虚线表示,当对象的过程处于激活状态时,生命线是一个双道线. 消息用从一个对象的生命线到另一个对象生命线的箭头表示.箭头以时间顺序在图中从上到下排列. 序列图中涉及的元素: 1. 生命线: 生命线名称可带下划线.当使用下划线时,意味着序列图中的生命线代表一个类的特定实例. 2. 同步消息 发送人在它继续之

UML类图二

在软件系统中,类并不是孤立存在的,类与类之间存在各种关系,对于不同类型的关系,UML提供了不同的表示方式.       1. 关联关系 关联(Association)关系是类与类之间最常用的一种关系,它是一种结构化关系,用于表示一类对象与另一类对象之间有联系,如汽车和轮胎.师傅和徒弟.班级和学生等等.在UML类图中,用实线连接有关联关系的对象所对应的类,在使用Java.C#和C++等编程语言实现关联关系时,通常将一个类的对象作为另一个类的成员变量.在使用类图表示关联关系时可以在关联线上标注角色名

CSDN markdown 编辑器 第一篇

最近CSDN 新出了markdown编辑器.我这也算是尝鲜. 最初接触markdown编辑器是在2011年.那个时候,使用markdown编辑器写blog.然后将blog放到github上托管.markdown还不能像现在这样可以实时编辑显现.那个时候有一个markdown engine专门将markdown语法转换成html. 每次感觉自己写对了.实际上语法各种不对. 究竟什么是markdown? markdown是一种更加贴近自然表达的语法,它可以转换成互联网上通用展示的html格式. -

CSDN markdown 编辑器 第二篇 markdown简单使用

第一篇简单介绍了markdown. 第一篇地址 第二篇主要会介绍不熟悉markdown语言的人如何使用CSDN新的编辑器.这里主要介绍图形编辑器.已经掌握的人请挪步. 前面几个都非常简单.例如对字体加粗和斜体. - 或者是对 [帐前卒专栏](http://chillyc.info) 加个链接.用![连接图标](http://img.blog.csdn.net/20150312221433385) - 再者就是加个图片:![图片图标](http://img.blog.csdn.net/201503