【问题标题】:DSL with XText for PlantUML用于 PlantUML 的带有 XText 的 DSL
【发布时间】:2016-02-16 17:57:21
【问题描述】:

目前我正在尝试为 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 定义的类使用交叉引用。

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

【问题讨论】:

  • 您的作品是否可以在某个地方(例如 github)免费获得?我想要一个带有代码完成功能的 PlantUML 编辑器。 XText 也是我的第一个想法,特别是考虑到 Eclipse 有一个 PlantUML 图表生成插件。
  • 啊,答案是肯定的。只需尝试https://github.com/tpschmidt 就可以了。太棒了!

标签: xtext plantuml


【解决方案1】:

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]

【讨论】:

  • 非常感谢!这对我帮助很大。 2) 的问题是,如果我不使用空格分隔箭头的字符,它将不接受任何内容。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-10
  • 2013-03-05
  • 2016-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多