Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何解析限定名表达式中的字段_Java_Xtext_Xtend_Qualified Name - Fatal编程技术网

Java 如何解析限定名表达式中的字段

Java 如何解析限定名表达式中的字段,java,xtext,xtend,qualified-name,Java,Xtext,Xtend,Qualified Name,以下是我的“类型”Xtext语法: grammar sample.types.Types with org.eclipse.xtext.common.Terminals generate types "http://www.types.sample/Types" Model: structs += Struct* data += Data* assignments += Assignment* ; Struct: 'struct' nam

以下是我的“类型”Xtext语法:

grammar sample.types.Types with org.eclipse.xtext.common.Terminals

generate types "http://www.types.sample/Types"

Model:
    structs     += Struct*
    data        += Data*
    assignments += Assignment*
;
Struct:
    'struct' name=ID '{'
        fields += Field*
    '}'
;
Field:
    type=Type name=ID
;
Type:
      'number'
    | 'string'
;
Data:
    type=[Struct|ID] name=ID
;
Assignment:
    qname=QName '=' value=Value
;
QName:
    data=[Data|ID] '.' path=[Field|ID]
;
Value:
      INT
    | STRING
;
下面是“类型”语法的一个实例:

struct SampleA {
    number n
    string s
}
struct SampleB {
    number n
    string s
}

SampleA sampleA1
SampleA sampleA2
SampleB sampleB

sampleA1.n = 12
sampleA1.s = "Hello"

sampleA2.n = 12
sampleA2.s = "Hello"

sampleB.n  = 42
sampleB.s  = "Hello"
最后六行引用字段“n”和“s”生成错误:

无法解析对字段“x”的引用

我编写了以下自定义作用域提供程序,但未成功:

class TypesScopeProvider extends AbstractTypesScopeProvider {

   override getScope( EObject context, EReference reference ) {
      if( reference === TypesPackage.Literals.QNAME__PATH ) {
         val model = EcoreUtil2.getContainerOfType(context, Model)
         if( model !== null ) {
            val result = newArrayList
            for( data : model.data ) {
               for( field : data.type.fields ) {
                  result.add(
                     EObjectDescription.create(
                        QualifiedName.create( data.name, field.name ),
                        field ))
               }
            }
            return new SimpleScope(IScope.NULLSCOPE, result)
         }
      }
      super.getScope( context, reference )
   }
}

在你的语法中

QName:
    data=[Data|ID] '.' path=[Field|ID]
;
因此,
a.b
将被划分为两个参考范围。因此,你要么在你的范围问题中反映这一点

// TODO: context will be a qname. ask it for its data. ask that for its data and collect fields from there and then
// scope for path
EObjectDescription.create(
                    QualifiedName.create(field.name ),
                    field ))
e、 g

或者你有语法来反映你的范围

DataOrField: Data | Field;
QName: dataOrField=[DataOrField|FQN]
FQN: ID ("." ID)?;

不,这不是解决方案(我已经尝试过了),因为字段的解析应该在实例类型的范围内进行。示例文本已升级。无论实例如何,单击“n”始终链接到第一个类型。第二个命题不符合我的语法。QName的前缀总是Data:Data。对不起,我无法复制。将用更多代码更新答案。
DataOrField: Data | Field;
QName: dataOrField=[DataOrField|FQN]
FQN: ID ("." ID)?;