Java 验证用户输入

Java 验证用户输入,java,eclipse-plugin,eclipse-rcp,dsl,xtext,Java,Eclipse Plugin,Eclipse Rcp,Dsl,Xtext,我在Xtext DSL中实现了以下规则: House: 'House' name=ID description=STRING? ('height' height=DOUBLE heightUnit=UNIT)? & ('width' width=DOUBLE widthUnit=UNIT)? & 'end' 'House' ; enum UNIT: m = 'm' | cm = 'cm'

我在Xtext DSL中实现了以下规则:

House:
    'House' name=ID
    description=STRING?
    ('height' height=DOUBLE heightUnit=UNIT)? &
    ('width' width=DOUBLE widthUnit=UNIT)? &
    'end' 'House' 
    ;

enum UNIT:
        m = 'm' |
        cm = 'cm'
    ;
它允许我使用基于该DSL的编辑器定义以下内容:

House MyHouse
    "This is my house"
    height 15.5 m
    width 3000.2 cm
end MyHouse
如何验证用户定义的单位?例如,高度和宽度都应以m为单位,如果用户定义了不同的内容(例如cm),则编辑器应显示错误

我检查了这个网站,它描述了如何创建验证规则,但我必须在哪里注册它们,这样它们才能正常工作

更新:如Ravens在其帖子下的评论所述,我使用了逆向工程并添加了相应的包和类,现在看起来如下所示:

package com.language.validation

import com.language.mylanguage.House
import org.eclipse.xtext.validation.Check

class MylanguageValidator {

    @Check
    def unitCheck(House house) {
        val hWidth = house.width

        if (hWidth != null) {
            if (!hWidth.equals("m")) {
                val errorMsg = "House width must be defined in m";
                // error method undefined
            }
        }
    }
}

该类的包位于插件项目
com.language.mylanguage
中。我试图验证,如果用户使用m作为单位。如果没有,则应显示一条错误消息。方法
error()
未定义。我必须导入或扩展另一个类吗?

在项目文件夹中,您有几个包,其中一个名为yourDSLName.validation。
在这个包中有一个xtend类,其中必须指定所有验证规则。 所以在这里,您在表单中添加了您的测试方法

@Check
def unitCheck(House house) {
   val hUnit = house.getHeigthUnit()
   val wUnit = house.getWidthUnit()

   if(hUnit != null && wUnit != null && !hUnit.equals(wUnit)) {
       val errorMsg = "Units have to be the same!"
       error(errorMsg, #Package.eINSTANCE.House_widthUnit)
   }
}
注意:您必须用DSL的packageName替换#软件包

更新:
您必须扩展类“AbstractMyLanguageValidator”


问候Raven

您的语言的mwe2工作流可能缺少验证程序片段。此片段创建存根并为您执行GUI绑定,因此您只需用逻辑填充类。

非常感谢您的快速响应!如果包不在那里(项目不是我创建的),我可以添加它吗?这个班看起来怎么样?你知道语言名称吗?如果是这样,您可以对名称进行反向工程。。。例如,名为“myLanguage”的语言包在“myLanguagePackage”包中,我必须实现抽象类还是应该自动创建它?因为找不到这样的类。如果找不到。我可以再次使用逆向工程,以某种方式创建它吗?:)我必须在什么地方注册吗?我不知道……对不起,我以前也没有处理过这种情况。但是你有语法,我假设你已经安装了Xtext框架,所以当你使用这个语法并用它生成一个新的Xtext项目时,你需要的一切都应该在那里……:)真的!将其添加到mwe2工作流后,该类将自动生成,我可以将验证添加到该类中。非常感谢!