【问题标题】:How are cardinalities written on XText from ecore meta model?基数是如何从 ecore 元模型写在 XText 上的?
【发布时间】:2020-10-15 05:05:45
【问题描述】:

我为状态机创建了一个 ecore 元模型。一台状态机有 0..* 状态、1..1 初始状态、1..1 最终状态和 1..* 转换。当我生成 XText 语法时,我会得到这样的结果

StateMachine:
'{'
        ('states' '{' states+=State ( "," states+=State)* '}' )?
        'transitions' '{' transitions+=Transitions ( "," transitions+=Transitions)* '}' 
        'initialstate' initialstate=InitialState
        'finalstate' finalstate=FinalState
    '}';

既然状态有 0..* 关系,它们不应该只有 * 运算符,意思是 0 或更多吗?为什么他们也有“?”运算符表示 0 还是 1?此外,转换具有 1..* 关系,它们不应该使用“+”运算符而不是 * 吗?

【问题讨论】:

    标签: eclipse eclipse-plugin dsl xtext


    【解决方案1】:

    我们先来看看transitions

    规则是transitions+=Transitions ( "," transitions+=Transitions)* 而不是(transitions+=Transitions)+,因为这是确保转换用逗号“,”分隔的简单方法。它可以读作“至少一个转换,然后是任意数量的转换,每个转换都以逗号为前缀”,匹配 [1..*] 基数。

    states 也是如此:

    • ('states' '{' ... '}' )? 表示当您的状态机不包含任何状态(与 0 下限匹配)时,可以省略整个块
    • ('states' '{' states+=State ... '}' )? 表示如果状态块被写入,那么它必须至少包含一个状态
    • ('states' '{' states+=State ( "," states+=State)* '}' )? 表示如果写入状态块,则它必须包含至少一个状态,并且可以通过用逗号分隔它们来指定更多状态“,”(与 * 上限匹配)。

    【讨论】:

      【解决方案2】:

      我个人认为你不需要 ?运算符,因为你已经使用了 * 运算符,也就是说,它可以是 0。 是的,运算符 * 是对的,因为您已经强制声明了至少一个状态,而另一个(逗号分隔)可以省略

      【讨论】:

        猜你喜欢
        • 2018-09-16
        • 2022-01-06
        • 2021-03-12
        • 2012-04-04
        • 2012-03-04
        • 1970-01-01
        • 2013-03-05
        • 2012-08-05
        • 1970-01-01
        相关资源
        最近更新 更多