【问题标题】:is it possible to assign constant values to attributes in xtext rule?是否可以为 xtext 规则中的属性分配常量值?
【发布时间】:2017-04-14 22:41:15
【问题描述】:

我有一个元模型,其中我有一个类 Rangemin 一个 max 整数值,我想定义一个 xText DSL,您可以在其中定义像 1..10 这样的范围,但也是标准的默认值如 ?! 将代表 0..11..1。我查看了文档,但找不到在 xText 语法中定义它的任何方法。到目前为止,我对一般情况有一个规则

Range: min=INT '..' max=INT;

但是,我没有找到任何方法来定义类似的东西

Range: '?' min=0 max=1;

Range: '!' min=1 max=1;

我怎样才能为我的 DSL 实现类似的行为?

请注意,我对从语法生成元模型不感兴趣,因为 DSL 模型应该遵循现有的元模型。

【问题讨论】:

    标签: xtext


    【解决方案1】:

    我不知道一个简单的解决方案,但您也许可以自定义 Xtexts 对象创建,例如喜欢

    Model: ranges+=AbstractRange*;
    AbstractRange returns Range: ExplicitRange | ZORange | OORange;
    ExplicitRange returns Range: min=INT ".." max=INT;
    ZORange returns Range: {Range} max=ZEROONE;
    ZEROONE returns ecore::EInt: "?";
    OORange returns Range: {Range} max=ONEONE;
    ONEONE returns ecore::EInt: "!";
    

    并遵循自定义

    class MyDslEcoreElementFactory extends DefaultEcoreElementFactory {
    
        @Inject extension MyDslGrammarAccess
    
        override set(EObject object, String feature, Object value, String ruleName, INode node) throws ValueConverterException {
            if (object instanceof Range) {
                if (ruleName == grammar.name+"."+ZEROONERule.name) {
                    object.max = 1
                    object.min = 0
                    return;
                } else if (ruleName == grammar.name+"."+ONEONERule.name) {
                    object.max = 1
                    object.min = 1
                    return;
                }
    
            }
            super.set(object, feature, value, ruleName, node)
        }
    
    }
    

    这样绑定

    class MyDslRuntimeModule extends AbstractMyDslRuntimeModule {
    
        override bindIAstFactory() {
            MyDslEcoreElementFactory
        }
    
    }
    

    不幸的是org.eclipse.xtext.parser.IAstFactory.create(EClassifier) 没有第二个参数来指定您所在的节点或规则,并且您拒绝引入范围的子类(在从您的元模型继承的元模型中),这会使这有点容易(仅覆盖创建)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-04-02
      • 2015-06-16
      • 1970-01-01
      • 2022-09-24
      • 2018-03-22
      • 2012-08-25
      • 1970-01-01
      相关资源
      最近更新 更多