带有XText的DSL用于PlantUML

施密特

目前,我正在尝试为PlantUML的类图创建DSL。我是Xtext的新手,我无法理解一些事情。在列出问题之前,我向您展示了我当前语法的某些部分:

ClassUml:
    {ClassUml}
    '@startuml' umlElements+=(ClassElement)* '@enduml';

ClassElement:
    Class
    | Association;

Class:
    {Class}
    'class' name=ClassName
    (color=ColorTag)?
    ('{' (classContents+=ClassContent)* '}')?;

ClassContent:
    Attribute | Method;

ClassName:
    (ID | STRING);

Attribute:
    {Attribute}
    (visibility=Visibility)? name=ID (":" type=ID)?;

Method:
    {Method}
     (visibility=Visibility)? name=METHID
     (":" type=ID)?;

Association:
    {Association}
    (classFrom=[Class]
    associationType=Bidirectional
    classTo=[Class])
    |
    (classTo=[Class]
    associationType=UnidirectionalLeft
    classFrom=[Class])
    |
    (classFrom=[Class]
    associationType=UnidirectionalRight
    classTo=[Class])
    (':' text+=(ID)*)?;

Bidirectional:
    {Bidrectional}
    ('-' ("[" color=ColorTag "]")? '-'?)
    | ('.' ("[" color=ColorTag "]")? '.'?);

UnidirectionalLeft:
    {UnidirectionalLeft}
    ('<-' ("[" color=ColorTag "]")? '-'?)
    | ('<.' ("[" color=ColorTag "]")? '.'?);

UnidirectionalRight:
    {UnidirectionalRight}
    ((('-[' color=ColorTag "]")|'-')? '->')
    | ((('.[' color=ColorTag "]")|'.')? '.>');

ColorTag:
    (COLOR | HEXCODE);

enum Visibility: 
    PROTECTED='#'
    | PRIVATE='-'
    | DEFAULT='~'
    | PUBLIC='+';

terminal COLOR:
    "#"
    ('red') | ('orange');

terminal HEXCODE:
    "#"
    ('A' .. 'F'|'0' .. '9')('A' .. 'F'|'0' .. '9')('A' .. 'F'|'0' .. '9')
    ('A' .. 'F'|'0' .. '9')('A' .. 'F'|'0' .. '9')('A' .. 'F'|'0' .. '9');

terminal STRING:
    '"' ('\\' . | !('\\' | '"'))* '"';

terminal ID:
    ('a'..'z' | 'A'..'Z' | '_' | '0'..'9' | '\"\"' | '//' | '\\')
    ('a'..'z' | 'A'..'Z' | '_' | '0'..'9' | '\"\"' | '//' | '\\' | ':')*;

我省略了其他关联类型(-*,-o,-|>),因为我以相同的方式定义了它们。

问题
1.可见性枚举“#”必须与方法/属性名称分开才能使用。但是所有其他情况(+,-,〜)都很好,并且之间没有空格。
2.在大多数情况下,关联似乎不起作用。我列举了一些例子:

' Working '
Alice -* Bob : Hello
Alice - Bob
Alice .o Bob
Alice <|-[#002211]- Bob
Alice *-[#red]- Bob
Alice -[#000000]-> Bob
Alice .[#red].> Bob

' Not Working '
Alice *-- Bob
Alice --* Bob
Alice .. Bob
Alice -[#ff0022]- Bob
Alice <-- Bob
Alice ..> Bob
Alice -- Bob
  1. 我不知道如何为由STRING而非ID定义的类使用交叉引用。

另外我猜方法名称的附加终端是一个奇怪的解决方案,应该以不同的方式处理。

斯文·埃夫汀

1)颜色应该是解析器规则,而不是终端规则。还要删除十六进制规则,只需使用更改后的ID规则即可。

Color:
   "#" ('red' | 'orange' | ID);

2)确保统一差异,例如

Bidirectional:
  ...
  ('-' ("[" ...;

UnidirectionalRight:
((('-[' ...;

序列“-[”将始终与后一个版本匹配。您应该创建一个规则AssociationType,并使它适用于所有情况。像这样的东西:

Association:
   {Association}
   (classFrom=[Class | ClassName]
   associationType=AssociationType
   classTo=[Class | ClassName])
   (':' text+=(ID)*)?;

AssociationType:
   {AssociationType} 
   left?='<'? ('-'|'.') ("[" color=Color "]")? ('-'|'.') right?='>'?;

3)通过对交叉引用使用以下语法,您也可以在交叉引用中允许使用STRING:classFrom = [Class | ClassName]

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

带有后视的 XText DSL

来自分类Dev

Xtext没有从我的dsl生成完整的类

来自分类Dev

Xtext:DSL对属性的引用

来自分类Dev

Xtext:DSL对属性的引用

来自分类Dev

带有可选参数的DSL语法

来自分类Dev

带有Spring DSL的Apache Camel

来自分类Dev

使用带有参数的spring DSL的controlBus

来自分类Dev

Xtext DSL:具有2个不同字符串的布尔规则

来自分类Dev

Xtext DSL:具有2个不同字符串的布尔规则

来自分类Dev

XText对非DSL资源的交叉引用

来自分类Dev

在Xtext中为我的DSL着色的语法

来自分类Dev

XText对非DSL资源的交叉引用

来自分类Dev

带有参数的Ruby DSL define_method

来自分类Dev

使用带有鼻子2这样的DSL的嘲笑装饰器

来自分类Dev

带有骆驼+ Groovy + Spring DSL的奇怪Behaiour

来自分类Dev

jOOQ-带有字段<Timestamp>的DSL.dateAdd

来自分类Dev

使用带有多个索引的elasticsearch DSL查询

来自分类Dev

带有ProgressBar的无尽RecyclerView用于分页

来自分类Dev

QStateMachine addTransition用于带有参数的信号

来自分类Dev

带有for循环的脚本,用于不同的变量

来自分类Dev

QStateMachine addTransition用于带有参数的信号

来自分类Dev

带有 Glide 的 AsyncTask 用于清除缓存

来自分类Dev

TableColumn #setCellValueFactory 用于带有 HashMap 的类

来自分类Dev

DSL用于文本解析

来自分类Dev

ANTLR和Xtext集成,用于开发插件

来自分类Dev

如何在Xtext DSL中嵌入C ++代码?

来自分类Dev

在独立Java项目中验证Xtext DSL时出错

来自分类Dev

如何从Java DSL中的Camel调用REST调用(带有JSON主体的POST)

来自分类Dev

带有选择功能的Camel Java DSL路由仅针对最后一种情况进行