xtext - 无法解析对的引用 [英] xtext - Couldn't resolve reference to

查看:30
本文介绍了xtext - 无法解析对的引用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有以下语法:

Model: prog+=Program*;

Program: g=Greeting  de+=DataEntry* s+=Statement*;

Greeting: 'Hello' t=ProgPara '!';

ProgPara: 'PROGRAM'  pname=Progname ';';

Progname : name=ID;

DataEntry:  a=INT v=Varname ';';   

Varname : name = ID;

Statement: (c=CopyStmt|m=MoveStmt) ';';

CopyStmt: 'COPY' 'TO' qname=[IndexVarname|ID] ;

IndexVarname : (Indexname|Varname);   

Indexname : '(' name = ID ')';

MoveStmt: 'MOVE' 'TO' p=[PrVarName|ID];

PrVarName : (Varname|Progname);

但它抛出错误:

PrVarName : (Varname|Progname);

所以我修改了语法如下:

So i modified the grammar to have as below:

PrVarName : (v=Varname|Progname);

我更新了 Scope 提供程序,如下所示:

I updated the Scope provider as below:

override getScope(EObject context, EReference reference) {
    if (context instanceof CopyStmt) {
        if (reference.featureID == TestDslPackage.COPY_STMT__QNAME) {
            val rootElement = EcoreUtil2.getRootContainer(context);
            val candidates1 = EcoreUtil2.getAllContentsOfType(rootElement, Indexname);
            val candidates2 = EcoreUtil2.getAllContentsOfType(rootElement, Varname);
            val candidates = candidates1 + candidates2;

            return Scopes.scopeFor(candidates);
        }
    } else if (context instanceof MoveStmt) {
        if (reference.featureID == TestDslPackage.MOVE_STMT__P) {
            val rootElement = EcoreUtil2.getRootContainer(context);
            val candidates1 = EcoreUtil2.getAllContentsOfType(rootElement, Progname);
            val candidates2 = EcoreUtil2.getAllContentsOfType(rootElement, Varname);
            val candidates = candidates1 + candidates2;

            return Scopes.scopeFor(candidates);
        }
    }       
}

一旦构建了语法并且我运行了下面的测试用例,它就会在 MOVE 语句中抛出错误,提示无法解析对 PrVarName 'test1' 的引用."

Once the grammar was built and i ran the below test case, it is throwing error in the MOVE statement saying "Couldn't resolve reference to PrVarName 'test1'."

Hello PROGRAM test;!

1 test1;
2 test2;
3 test3;

COPY TO test2;
MOVE TO test1;

看起来我不能在两个不同的交叉引用中使用 Varname.但是有一个非常有效的需求.我如何实现这一目标?

Looks like i cannot use Varname in two different cross references. But there is a very valid need for it. How do I achieve this?

提前致谢.

推荐答案

PrVarName : p=(Progname|Varname);

不好,因为它改变了类型层次结构.Progname 和 Varname 不再是 PrVarName 的子类型.通过恢复更改并引入一个通用的 Named 超类型,您可以解决这个问题

is bad cause it changes the type hierarchy. Progname and Varname are no longer subtypes of PrVarName. By reverting the change and introducing a common Named supertype you can resolve this

Model:
    prog+=Program*;

Program:
    g=Greeting de+=DataEntry* s+=Statement*;

Greeting:
    'Hello' t=ProgPara '!';

ProgPara:
    'PROGRAM' pname=Progname ';';

DataEntry:
    a=INT (v=Varname | in=Indexname) ';';

Statement:
    (c=CopyStmt | m=MoveStmt) ';';

CopyStmt:
    'COPY' 'TO' qname=[IndexVarname|ID];

MoveStmt:
    'MOVE' 'TO' p=[PrVarName|ID];

PrVarName:
    Progname | Varname;

IndexVarname:
    (Indexname | Varname);

Named:Progname|Indexname|Varname;   

Progname:
    {Progname} name=ID; 

Indexname:
    {Indexname}'(' name=ID ')';

Varname:
    {Varame}name=ID;    

这篇关于xtext - 无法解析对的引用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆