Java 如何修复执行EValidator时发生的错误

Java 如何修复执行EValidator时发生的错误,java,eclipse,xtext,xtend,Java,Eclipse,Xtext,Xtend,我想用xtext创建obj文件的解析器。我已经写了语法的一部分,现在我正在写验证器,但是在测试我的语法和验证器时发生了一个错误。有人能帮我吗 这是我的语法代码: grammar ce.xtend.projects.mobj.MObj with org.eclipse.xtext.common.Terminals //hidden() generate mObj "http://www.xtend.ce/projects/mobj/MObj" ObjMdodel: {ObjMdodel

我想用xtext创建obj文件的解析器。我已经写了语法的一部分,现在我正在写验证器,但是在测试我的语法和验证器时发生了一个错误。有人能帮我吗

这是我的语法代码:

grammar ce.xtend.projects.mobj.MObj with org.eclipse.xtext.common.Terminals //hidden()

generate mObj "http://www.xtend.ce/projects/mobj/MObj"

ObjMdodel:
    {ObjMdodel}('Start' 
          (subElements+= SubElement)+ 
    'End')
          ;

SubElement:
 Part|Group
;
Part:
'Part' name=ID  "{"  content = PartContent   "}"  
;
Group:
    'Group' name=ID  "{"  content = GroupContent  "}"  ;
PartContent:

        ( 'Type' ":" partType =PartType ';' ) 
        ('CsType' ':' a_csType= A_CsType 
            '{'    '}'';'
        )?
        ('Degree' ':' degValue=INT ';')? 
        ('Step' ':' step=INT ';')?
        ('Matrix'  matrix=Matrix)?

        (vertList += Vertices+)
;
GroupContent:
     {GroupContent} (parts +=Part+ )
;   
Vertices:
    'Vertices' name = ID "{" 
          verticesContent=VerticesContent 
         "}" 
; 
VerticesContent:
    ('Type' ':' vertType = VertType ';' ) 
          (vertices+=Vertice+ )
      ('Order' ':' '[' orderContent +=(VERTICE_ORDER_CONTENT)+ ']' ';' )
; 


Vertice:
    ('x' | 'X') '=' x=FLOAT ',' ('y' | 'Y') '=' y=FLOAT ',' ('z' | 'Z') '=' z=FLOAT (',' ('w' | 'W') '=' w=FLOAT )?';' 

;

terminal VERTICE_ORDER_CONTENT:
    (WS* INT WS*)/*|(INT WS* ';' WS* INT)(';')?(WS* INT WS*)?*/
;
terminal FLOAT: 
 '-'?(( INT? '.' INT (('E'|'e') '-'? INT)?))|INT;

enum VertType:
    Geometric='Geo'|Normal='Norm'|Textuture='Text'
;
enum PartType:
    Face='Face' |Curve ='Curve' | Line='Line' | Surface='Surface'|Point='Point'
;


enum A_CsType:
    Bezier='Bezier' |Bmatrix ='Bmatrix' | Bspline='Bspline' | Cardinal='Cardinal' | Taylor = 'Taylor'
;

Matrix:
    name=ID '{'
    ('Type' ':' type = MatrixType ';')
    (lines +=MatrixLine+)
    '}';

MatrixLine:
    {MatrixLine} line+=(FLOAT)* ((INT)*)';'
;

enum MatrixType:
    uType = 'U'|vType='V'|u_lType ='u'|v_lType='v'
;

这是我在xtend中的验证器

class MObjValidator extends AbstractMObjValidator {

    public static val InvalidVertListSize = 'ce.xtend.projects.mobj.InvalidVertListSize';
    public static val InvalidVerticesContent = 'ce.xtend.projects.mobj.InvalidVerticesContent';
    public static val InvalidVerticeTypeNumber = 'ce.xtend.projects.mobj.InvalidVerticeTypeNumber';
    public static val InvalidVerticeOrder = 'ce.xtend.projects.mobj.InvalidOrder';


    @Check
    def checkVerticesType(Part part) {

        //var part = subElt as Part;
        if (part !== null) {
            //var content = part.content;
            //var vertList = part.content.vertList;

            var normDefined = false;
            var geoDefined = false;
            var textDefined = false;

            for (vert : part.content.vertList) {

                if (vert.verticesContent.vertType === VertType.GEOMETRIC) {

                    if (geoDefined) {
                        error("A vertice list of type geometric already defined",vert,
                                MObjPackage.Literals.VERTICES_CONTENT__VERT_TYPE, InvalidVerticeTypeNumber,vert.toString());

                    } else {
                        geoDefined = true;
                    }
                } else {
                    if (vert.verticesContent.vertType === VertType.NORMAL) {
                        if (normDefined) {
                            error("A vertice list of type normal already defined",
                                MObjPackage.Literals.VERTICES_CONTENT__VERT_TYPE, InvalidVerticeTypeNumber,vert.toString());
                                //System.out.println("Error normal")
                        } else {
                            normDefined = true;
                        }
                    } else {
                        if (vert.verticesContent.vertType === VertType.TEXTUTURE) {
                            if (textDefined) {
                            error("A vertice list of type texture already defined",vert,
                                        MObjPackage.Literals.VERTICES_CONTENT__VERT_TYPE, InvalidVerticeTypeNumber,vert.toString());
                                System.out.println("Error texture")
                            } else {
                                textDefined = true;
                            }
                        }
                    }

                }
            }
        }
    }


}

这是我的文件测试文件


Start
Part t 
{
    Type: Surface;
    Vertices tt 
    {
        Type:Text;

        x=1.0,y=2.0, Z=3.0;
        x=1.0 ,y=2.0, Z=3.0;
        x=5.0,y=2.0, Z= -3.0;
         Order : [1 5];

    }
        Vertices tt 
    {
        Type:Text;

        x=1.0,y=2.0, Z=3.0;
        x=1.0 ,y=2.0, Z=3.0;
        x=5.0,y=2.0, Z= -3.0;
         Order : [1 5];

    }

}
End


这里是错误消息

java.lang.IllegalArgumentException: The sources EClass 'Vertices' does not expose the feature 'VerticesContent.vertType'
    at org.eclipse.xtext.validation.FeatureBasedDiagnostic.<init>(FeatureBasedDiagnostic.java:33)
    at org.eclipse.xtext.validation.AbstractDeclarativeValidator.createDiagnostic(AbstractDeclarativeValidator.java:623)
    at org.eclipse.xtext.validation.AbstractDeclarativeValidator.acceptError(AbstractDeclarativeValidator.java:563)
    at org.eclipse.xtext.validation.AbstractDeclarativeValidator.error(AbstractDeclarativeValidator.java:441)
    at ce.xtend.projects.mobj.validation.MObjValidator.checkVerticesType(MObjValidator.java:79)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.eclipse.xtext.validation.AbstractDeclarativeValidator$MethodWrapper.invoke(AbstractDeclarativeValidator.java:127)
    at org.eclipse.xtext.validation.AbstractDeclarativeValidator.internalValidate(AbstractDeclarativeValidator.java:318)
    at org.eclipse.xtext.validation.AbstractInjectableValidator.validate(AbstractInjectableValidator.java:71)
    at org.eclipse.xtext.validation.CompositeEValidator.validate(CompositeEValidator.java:150)
    at org.eclipse.emf.ecore.util.Diagnostician.doValidate(Diagnostician.java:257)
    at org.eclipse.emf.ecore.util.Diagnostician.validate(Diagnostician.java:244)
    at org.eclipse.xtext.validation.CancelableDiagnostician.validate(CancelableDiagnostician.java:40)
    at org.eclipse.emf.ecore.util.Diagnostician.validate(Diagnostician.java:201)
    at org.eclipse.emf.ecore.util.Diagnostician.validate(Diagnostician.java:143)
    at org.eclipse.xtext.validation.ResourceValidatorImpl.validate(ResourceValidatorImpl.java:146)
    at org.eclipse.xtext.validation.ResourceValidatorImpl.validate(ResourceValidatorImpl.java:124)
    at org.eclipse.xtext.validation.ResourceValidatorImpl.validate(ResourceValidatorImpl.java:90)
    at org.eclipse.xtext.ui.editor.validation.ValidationJob$1.exec(ValidationJob.java:91)
    at org.eclipse.xtext.ui.editor.validation.ValidationJob$1.exec(ValidationJob.java:1)
    at org.eclipse.xtext.util.concurrent.CancelableUnitOfWork.exec(CancelableUnitOfWork.java:26)
    at org.eclipse.xtext.resource.OutdatedStateManager.exec(OutdatedStateManager.java:91)
    at org.eclipse.xtext.ui.editor.model.XtextDocument$XtextDocumentLocker.internalReadOnly(XtextDocument.java:527)
    at org.eclipse.xtext.ui.editor.model.XtextDocument$XtextDocumentLocker.readOnly(XtextDocument.java:499)
    at org.eclipse.xtext.ui.editor.model.XtextDocument.readOnly(XtextDocument.java:138)
    at org.eclipse.xtext.ui.editor.validation.ValidationJob.createIssues(ValidationJob.java:86)
    at org.eclipse.xtext.ui.editor.validation.ValidationJob.run(ValidationJob.java:67)
    at org.eclipse.core.internal.jobs.Worker.run(Worker.java:63)

java.lang.IllegalArgumentException:源电子类“顶点”未公开功能“VerticesContent.vertType”
位于org.eclipse.xtext.validation.FeatureBasedDiagnostic(FeatureBasedDiagnostic.java:33)
位于org.eclipse.xtext.validation.AbstractDeclarativeValidator.createDiagnostic(AbstractDeclarativeValidator.java:623)
位于org.eclipse.xtext.validation.AbstractDeclarativeValidator.acceptError(AbstractDeclarativeValidator.java:563)
位于org.eclipse.xtext.validation.AbstractDeclarativeValidator.error(AbstractDeclarativeValidator.java:441)
位于ce.xtend.projects.mobj.validation.MObjValidator.checkVerticesType(MObjValidator.java:79)
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
位于sun.reflect.NativeMethodAccessorImpl.invoke(未知源)
在sun.reflect.DelegatingMethodAccessorImpl.invoke处(未知源)
位于java.lang.reflect.Method.invoke(未知源)
位于org.eclipse.xtext.validation.AbstractDeclarativeValidator$MethodWrapper.invoke(AbstractDeclarativeValidator.java:127)
位于org.eclipse.xtext.validation.AbstractDeclarativeValidator.internalValidate(AbstractDeclarativeValidator.java:318)
位于org.eclipse.xtext.validation.AbstractInjectableValidator.validate(AbstractInjectableValidator.java:71)
位于org.eclipse.xtext.validation.CompositeEValidator.validate(CompositeEValidator.java:150)
位于org.eclipse.emf.ecore.util.Diagnostician.doValidate(Diagnostician.java:257)
位于org.eclipse.emf.ecore.util.Diagnostician.validate(Diagnostician.java:244)
位于org.eclipse.xtext.validation.CancelableDiagnostician.validate(CancelableDiagnostician.java:40)
位于org.eclipse.emf.ecore.util.Diagnostician.validate(Diagnostician.java:201)
位于org.eclipse.emf.ecore.util.Diagnostician.validate(Diagnostician.java:143)
位于org.eclipse.xtext.validation.ResourceValidatorImpl.validate(ResourceValidatorImpl.java:146)
位于org.eclipse.xtext.validation.ResourceValidatorImpl.validate(ResourceValidatorImpl.java:124)
位于org.eclipse.xtext.validation.ResourceValidatorImpl.validate(ResourceValidatorImpl.java:90)
位于org.eclipse.xtext.ui.editor.validation.ValidationJob$1.exec(ValidationJob.java:91)
位于org.eclipse.xtext.ui.editor.validation.ValidationJob$1.exec(ValidationJob.java:1)
位于org.eclipse.xtext.util.concurrent.CancelableUnitOfWork.exec(CancelableUnitOfWork.java:26)
位于org.eclipse.xtext.resource.OutdatedStateManager.exec(OutdatedStateManager.java:91)
位于org.eclipse.xtext.ui.editor.model.XtextDocument$XtextDocumentLocker.internalReadOnly(XtextDocument.java:527)
位于org.eclipse.xtext.ui.editor.model.XtextDocument$XtextDocumentLocker.readOnly(XtextDocument.java:499)
位于org.eclipse.xtext.ui.editor.model.XtextDocument.readOnly(XtextDocument.java:138)
位于org.eclipse.xtext.ui.editor.validation.ValidationJob.createIssues(ValidationJob.java:86)
位于org.eclipse.xtext.ui.editor.validation.ValidationJob.run(ValidationJob.java:67)
位于org.eclipse.core.internal.jobs.Worker.run(Worker.java:63)

我希望它会打印我的错误消息:“已定义类型纹理的vertice列表”

您使用错误的参数调用错误方法

应该是

error("Message", object, feature, issueCode, issueData)
在您的情况下,对象和特征不匹配。 e、 这里

error("A vertice list of type texture already defined",vert,MObjPackage.Literals.VERTICES_CONTENT__VERT_TYPE, InvalidVerticeTypeNumber,vert.toString());
实际上应该是

error("A vertice list of type texture already defined",vert,MObjPackage.Literals.VERTICES__NAME, InvalidVerticeTypeNumber,vert.toString());


根据实际要加下划线的内容,可以使用错误的参数调用error方法

应该是

error("Message", object, feature, issueCode, issueData)
在您的情况下,对象和特征不匹配。 e、 这里

error("A vertice list of type texture already defined",vert,MObjPackage.Literals.VERTICES_CONTENT__VERT_TYPE, InvalidVerticeTypeNumber,vert.toString());
实际上应该是

error("A vertice list of type texture already defined",vert,MObjPackage.Literals.VERTICES__NAME, InvalidVerticeTypeNumber,vert.toString());

取决于您实际想要下划线的内容