【问题标题】:Xbase Interpreter: Could not access field on instance: nullXbase 解释器:无法访问实例上的字段:null
【发布时间】:2019-01-31 17:53:22
【问题描述】:

我正在测试使我的 dsl Jvm 兼容的想法,并且我想测试扩展 Xbase 和使用解释器的可能性。我试图制作一个与解释器一起使用的最小测试项目,但我遇到了运行时错误。我想我了解适应 Xbase 的一般概念,但不确定解释器的设置/入口点如何,并且找不到有关我遇到的错误或如何解决的任何信息。以下是我的情况的相关文件:

文本.xtext:

import "http://www.eclipse.org/xtext/xbase/Xbase" as xbase
import "http://www.eclipse.org/xtext/common/JavaVMTypes" as types

Program returns Program:
    {Program}
    'program' name=ID '{'
    variables=Var_Section?
    run=XExpression?
    '}'
;

Var_Section returns VarSection:
    {VarSection}
    'variables' '{'
        decls+=XVariableDeclaration+
    '}'
;


@Override // Change syntax
XVariableDeclaration returns xbase::XVariableDeclaration:
    type=JvmTypeReference name=ID '=' right=XLiteral ';'
;
@Override // Do not allow declarations outside of variable region
XExpressionOrVarDeclaration returns xbase::XExpression:
    XExpression;

TestJvmModelInferrer:

def dispatch void infer(Program element, IJvmDeclaredTypeAcceptor acceptor, boolean isPreIndexingPhase) {
        acceptor.accept(element.toClass(element.fullyQualifiedName)) [
            documentation = element.documentation
            if (element.variables !== null) {
                for (decl : element.variables.decls) {
                    members += decl.toField(decl.name, decl.type) [
                        static = true
                        initializer = decl.right
                        visibility = JvmVisibility.PUBLIC
                    ]
                }
            }

            if (element.run !== null) {
                members += element.run.toMethod('main', typeRef(Void::TYPE)) [
                    parameters += element.run.toParameter("args", typeRef(String).addArrayTypeDimension)
                    visibility = JvmVisibility.PUBLIC
                    static = true
                    body = element.run
                ]
            }
        ]
    }

测试用例:

@Inject ParseHelper<Program> parseHelper
@Inject extension ValidationTestHelper
@Inject XbaseInterpreter interpreter
@Test
    def void basicInterpret() {
        val result = parseHelper.parse('''
        program program1 {
            variables {
                int var1 = 0;
                double var2 = 3.4;
            }
            var1 = 13
        }
        ''')
        result.assertNoErrors
        var interpretResult = interpreter.evaluate(result.run)
        println(interpretResult.result)

部分堆栈跟踪:

java.lang.IllegalStateException: Could not access field: program1.var1 on instance: null
    at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._assignValueTo(XbaseInterpreter.java:1262)
    at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.assignValueTo(XbaseInterpreter.java:1221)
    at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:1213)
    at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:216)
    at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:204)
    at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.evaluate(XbaseInterpreter.java:190)
    at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.evaluate(XbaseInterpreter.java:180)

【问题讨论】:

    标签: interpreter xtext xtend xbase


    【解决方案1】:

    解释器仅支持表达式,但不适用于由 JvmModelInferrer 创建的类型。您的代码尝试使用此类推断类型的字段。

    我建议您在测试中使用 InMemoryCompiler,而不是使用解释器。 domainmodel 示例可以作为启发:https://github.com/eclipse/xtext-eclipse/blob/c2b15c3ec118c4c200e2b28ea72d8c9116fb6800/org.eclipse.xtext.xtext.ui.examples/projects/domainmodel/org.eclipse.xtext.example.domainmodel.tests/xtend-gen/org/eclipse/xtext/example/domainmodel/tests/XbaseIntegrationTest.java

    【讨论】:

    • 有趣的选择。我不确定它是否能解决我整个项目的用例。有没有办法扩展解释器状态管理以适用于推断类型?
    • 您必须为Java 构建一个完全工作的解释器,例如支持从Java 类继承是很棘手的,多态性也不是微不足道的。基本上,工作量取决于您的实际用例。
    • 好吧,就我而言,可能不值得为奖励付出努力。感谢您的回答!
    【解决方案2】:

    您可能会发现这个项目很有趣,它(除其他外)基于 Xbase 解释器为 Xtend 实现了一个解释器。不过,它可能有点过时,而且也不会完全支持所有 Xtend 概念。但这可能是一个起点,欢迎您的贡献:-)

    https://github.com/kbirken/xtendency

    【讨论】:

    • 有趣的项目,正如 Sebastian 所说,在 Xbase 解释器之上构建完整的 java 互操作并不是一件容易的事,遗憾的是我没有额外的时间。但是,如果此功能成为更多焦点,我一定会记住这一点。
    猜你喜欢
    • 2021-03-29
    • 1970-01-01
    • 2022-10-13
    • 2021-06-29
    • 1970-01-01
    • 2021-06-24
    • 2021-10-16
    • 1970-01-01
    • 2018-11-16
    相关资源
    最近更新 更多