Xtext - 输入时没有可行的选择

时间:2014-09-06 13:01:01

标签: java xtext

我正在尝试创建一种语法,该语法可以创建一种可以创建方法的脚本语言。

语法

grammar org.example.domainmodel.Domainmodel with org.eclipse.xtext.xbase.Xbase

generate domainmodel "http://www.example.org/domainmodel/Domainmodel"

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


Model:
    imports = XImportSection
    methods += XMethodDeclaration*
    body = XBlockScriptLanguage;

XMethodDeclaration:
    "def" type=JvmTypeReference name=ValidID 
    '('(params+=FullJvmFormalParameter (',' params+=FullJvmFormalParameter)*)? ')'
        body=XBlockExpression
;

XBlockScriptLanguage returns xbase::XExpression:
    {xbase::XBlockExpression}
        (expressions+=XExpressionOrVarDeclaration ';'?)*
;

目前我创建了以下JvmModelInferr,用于定义脚本语言的主要方法。

JvmModelInferr

def dispatch void infer(Model model, IJvmDeclaredTypeAcceptor acceptor, boolean isPreIndexingPhase) {
        acceptor.accept(
            model.toClass("myclass")
        ).initializeLater [
                members += model.toMethod("main", model.newTypeRef(Void::TYPE)) [                       
                    parameters += model.toParameter("args", model.newTypeRef(typeof(String)).addArrayTypeDimension)
                    setStatic(true)
                    body = model.body

                    ]
            ]
    }  

当我尝试使用我的语法时,我在编写方法后得到以下错误:

  • 输入' def'
  • 没有可行的选择
  • 方法mymethod()未定义

问题只与方法声明有关,没有创建myclass.java。 此外,我获得了警告200"对于不清楚的语法,为什么?

1 个答案:

答案 0 :(得分:0)

有两个必要修复:

  1. imports部分未标记为可选。如果它是可选的,则应声明为imports ?= XImportSection。或者,在JvmModelInferr示例中添加必要的import语句。

  2. 您的语法中未定义dispatch关键字。根据定义,method应该由def组成,后跟Java类型(返回类型),然后是方法的名称(然后是正文等)。如果你的目标是Xtend并且打算支持它的多重调度功能(或你自己的版本),你可以添加`(dispatch?='dispatch')。

  3. HTH