我正在尝试创建一种语法,该语法可以创建一种可以创建方法的脚本语言。
语法
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
]
]
}
当我尝试使用我的语法时,我在编写方法后得到以下错误:
问题只与方法声明有关,没有创建myclass.java。 此外,我获得了警告200"对于不清楚的语法,为什么?
答案 0 :(得分:0)
有两个必要修复:
imports
部分未标记为可选。如果它是可选的,则应声明为imports ?= XImportSection
。或者,在JvmModelInferr示例中添加必要的import语句。
您的语法中未定义dispatch
关键字。根据定义,method
应该由def
组成,后跟Java类型(返回类型),然后是方法的名称(然后是正文等)。如果你的目标是Xtend并且打算支持它的多重调度功能(或你自己的版本),你可以添加`(dispatch?='dispatch')。
HTH