如何更改 QualifiedNames 的分隔符

How to change the delimiter of QualifiedNames

我想将 QualifiedName 的分隔符从“.”更改为到 '#'。下面是我的尝试。以下示例来自在线文档。

grammar org.xtext.example.mydsl.MyDsl with org.eclipse.xtext.common.Terminals

generate myDsl "http://www.xtext.org/example/mydsl/MyDsl"

Domainmodel:
    (elements+=AbstractElement)*;
 
PackageDeclaration:
    'package' name=QualifiedName '{'
        (elements+=AbstractElement)*
    '}';
 
AbstractElement:
    PackageDeclaration | Type;
 
QualifiedName:
    ID ('#' ID)*;
 
Type:
    DataType | Entity;
 
DataType:
    'datatype' name=ID;
 
Entity:
    'entity' name=ID ('extends' superType=[Entity|QualifiedName])? '{'
        (features+=Feature)*
    '}';
 
Feature:
    (many?='many')? name=ID ':' type=[Type|QualifiedName];

package org.xtext.example.mydsl

import org.eclipse.xtext.naming.IQualifiedNameConverter
import org.eclipse.xtext.naming.DefaultDeclarativeQualifiedNameProvider

/**
 * Use this class to register components to be used at runtime / without the Equinox extension registry.
 */
class MyDslRuntimeModule extends AbstractMyDslRuntimeModule {
    override  bindIQualifiedNameProvider() {
        return MyDslQualifiedNameProvider
    }
    
}

class MyDslQualifiedNameProvider extends DefaultDeclarativeQualifiedNameProvider {
    val converter = new MyDslQualifiedNameConverter();
    
    override getConverter(){
        converter
    }
    
}

class MyDslQualifiedNameConverter extends IQualifiedNameConverter.DefaultImpl {
    override getDelimiter() {
            return "#";
    }
}

我无法在包中引用任何 Entity,例如下面的“my#company#blog#Blog”。 IDE 建议使用表达式“my#company#blog.Blog”,但这也不起作用。

datatype String
package my#company#blog{ 
    entity Blog{
        title : String
    }
}
entity Blog2 extends my#company#blog#Blog{
    title : String
}

Guice用法解决。以下是如何完成的。 'AbstractMyDslRuntimeModule' 中没有要覆盖的绑定方法。 Parent class, 'AbstractGenericModule', 通过自身的 'getBindings' 方法来完成这个技巧。

class MyDslRuntimeModule extends AbstractMyDslRuntimeModule {
    def Class<? extends IQualifiedNameConverter> bindIQualifiedNameConverter() {
        return MyDslQualifiedNameConverter;
    }
}
class MyDslQualifiedNameConverter extends IQualifiedNameConverter.DefaultImpl {
    override getDelimiter() {
            return "#";
    }
}