Реализация DefaultTerminalConverters для создания экземпляра Integer вместо терминального правила в Xtext выбрасывает ClassCastException - PullRequest
0 голосов
/ 20 февраля 2019

Я хочу реализовать свой собственный класс DefaultTerminalConverters для того, чтобы передать значение Integer вместо правила терминала VALUE_TERMINAL

VALUE_TERMINAL из моей грамматики:

terminal VALUE_TERMINAL: 
    ( '0' .. '9' )+ ;

код моего собственного DefaultTerminalConverters:

import com.google.inject.Inject;
import org.eclipse.xtext.common.services.DefaultTerminalConverters;
import org.eclipse.xtext.conversion.IValueConverter;
import org.eclipse.xtext.conversion.ValueConverter;
import org.eclipse.xtext.conversion.impl.AbstractLexerBasedConverter;
import org.eclipse.xtext.nodemodel.INode;

public class MyLangValueConverter extends DefaultTerminalConverters {
    @Inject MyINTValueConverter myINTValueConverter;

    @ValueConverter(rule="VALUE_TERMINAL") 
    public IValueConverter<Integer> VALUE_TERMINAL() {
        return myINTValueConverter;
    }

    private static class MyINTValueConverter extends AbstractLexerBasedConverter<Integer> {
        @Override
        public Integer toValue(String string, INode node) {
            return new Integer(string);
        }

        @Override
        public String toString(Integer value){
            return String.valueOf(value);
        }
    }
}

Когда я пишу что-то в моем собственном DSL, я всегда получаю ошибку java.lang.Integer cannot be cast to java.lang.String при использовании VALUE_TERMINAL.В чем может быть проблема ?

1 Ответ

0 голосов
/ 24 февраля 2019

проблема в грамматике:

terminal VALUE_TERMINAL: 
( '0' .. '9' )+ ;

является сокращением от

import "http://www.eclipse.org/emf/2002/Ecore" as ecore
...
terminal VALUE_TERMINAL returns ecore::EString: 
( '0' .. '9' )+ ;

, поэтому вам необходимо явно указать возвращаемый тип данных для правила терминала.что-то вроде

terminal VALUE_TERMINAL returns ecore::EInt:

или

terminal VALUE_TERMINAL returns ecore::EIntegerObject:
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...