2015-09-23 3 views
0

Я реализованы следующие правила в моем XText DSL:Validate пользовательский ввод

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, и если пользователь определяет что-то другое (например, см), редактор должен показать ошибку.

Я проверил сайт this, в котором описывается, как создавать правила проверки, но где я должен их регистрировать, чтобы они могли работать по-настоящему?

UPDATE: Как описано в Ravens комментарий под свой пост, я использовал обратный инжиниринг и добавил correspondig пакет и класс, который теперь выглядит следующим образом:

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. Я пытаюсь проверить, если пользователь использовал м в качестве устройства. Если нет, должно появиться сообщение об ошибке. Метод error() не определен. Нужно ли мне импортировать или расширять другой класс?

ответ

1

mwe2 рабочий процесс вашего языка, вероятно, отсутствует ValidatorFragment. Этот фрагмент создает заглушку и делает привязки для вас, поэтому вам нужно только заполнить класс логикой.

+0

True!После добавления в рабочий процесс mwe2 класс создается автоматически, и я могу добавить к нему свои проверки. Большое спасибо! – John

1

В папке проекта у вас есть несколько пакетов, и один из них имеет имя 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) 
    } 
} 

Примечание: Вы должны заменить #Package с PACKAGENAME вашего DSL.

UPDATE:
Вы должны расширить класс "AbstractMyLanguageValidator"

приветствий Raven

+0

Большое спасибо за ваш быстрый ответ! Если пакета нет (проект не был создан мной), могу ли я добавить его дополнительно? Как бы выглядел класс? – John

+0

Знаете ли вы название языка? Если это так, вы можете перепроектировать имя ... Например, пакет для языка с именем «myLanguage» находится в пакете «myLanguagePackage» – Raven

+0

Обновлено мое сообщение. :) – John

Смежные вопросы