首页 > 解决方案 > Ecore::EString: 可以在 Xtext 语法中使用吗?

问题描述

我从一个 ecore 模型生成了一个 Xtext 语法,我得到的语法如下:


generate myDsl "http://www.xtext.org/example/mydsl16/MyDsl"
import "http://www.eclipse.org/emf/2002/Ecore" as ecore

WorldMap returns WorldMap:
    'WorldMap'
    '{'
        'WorldMap' WorldMap=EString
        'countrycorona'  countrycorona+=CountryCorona ( "," countrycorona+=CountryCorona)*  
    '}';


CountryCorona returns CountryCorona:
    'CountryCorona'
    '{'
        'CountryCorona' CountryCorona=EString
        'population' population=EInt
        'continent' continent=EString
        'infectedPopulation' infectedPopulation=EInt
        'zonelabel' zonelabel=zonelabelcolour
    
    '}';

EString returns ecore::EString:
    STRING | ID;

EInt returns ecore::EInt:
    '-'? INT;

enum zonelabelcolour returns zonelabelcolour:
                red = 'red' | orange = 'orange' | yellow = 'yellow' | green = 'green' | white = 'white'; 

我的问题是,当我尝试为此语法编写模型时,我通常使用 CTRL 空格来获取以下标记的建议。然而,在我写完 WorldMap { WorldMap 之后,我得到了

输入''没有可行的替代方案

此外,我没有得到下一个令牌应该是 EString 的建议。参考 Xtext 文档我应该能够使用这个 EString,但显然我不能。你知道可能是什么问题吗?

谢谢!

标签: eclipsedslxtextecore

解决方案


Xtext 内容辅助不会对数据类型规则进行深入分析。因此,您必须自己在提案提供者中实施内容辅助规则,例如

public class MyDslProposalProvider extends AbstractMyDslProposalProvider {
    
    @Override
    public void complete_EString(EObject model, RuleCall ruleCall, ContentAssistContext context,
            ICompletionProposalAcceptor acceptor) {
        acceptor.accept(createCompletionProposal("NiceID", context));
        acceptor.accept(createCompletionProposal("\"NiceString\"", context));
    }
}

推荐阅读