生成的编辑器中的异常:Xtext错误或语法错误?

时间:2013-09-10 09:13:54

标签: eclipse parsing xtext

在迁移到Xtext 2.4.2和Eclipse Kepler之后,我们的DSL编辑器出现了一个问题。之前一切都很完美(Xtext 2.3.x,Juno)。

编辑初始化列表时,我们的DSL编辑器会抛出ClassCastException: [1,2,3] Xtext Error Pop-up

重现的步骤:

  1. 创建一个新的“Xtext状态机示例”项目
  2. 使用下面的
  3. 编辑语法
  4. 删除包org.eclipse.xtext.example.fowlerdsl.generator(它将在4时重新生成。)
  5. 运行org.eclipse.xtext.example.fowlerdsl.GenerateStatemachine.mwe2工作流程
  6. 运行eclipse应用程序
  7. 在空项目中创建一个新文件(example.statemachine)并复制以下内容
  8. 语法:

    grammar org.eclipse.xtext.example.fowlerdsl.Statemachine
        with org.eclipse.xtext.common.Terminals
    generate statemachine "http://www.eclipse.org/xtext/example/fowlerdsl/Statemachine"
    
    Statemachine : {Statemachine}
        (vars += VarDeclWithOptionalInit)*
    ;
    VarDeclWithOptionalInit returns Variable:
        VarDecl ('=' value=AstExpression)?
    ;
    VarDecl returns Variable:
        'var' name = ID
    ;
    AstExpression:
          ExpressionList
        | {AstExpression} INT
    ;
    ExpressionList:
        '[' expressions+=AstExpression (',' expressions+=AstExpression)* ']'
    ;
    

    example.statemachine的内容

    //Adding space between chars inside [] cause Exception
    var example1 = [1, 2, 3]
    
    //Doing the same in [10, 20] or [30, 40] is Ok, but modifying
    //the top-level list cause the Exception
    var example2 = [[10, 20], 0, [30, 40], 1, 2]
    

    我认为示例文件的内容是正确的。但是当我使用新值编辑列表时,或者当我在逗号或值周围添加空格时,编辑器会弹出一个来自XtextReconcilierJob的ClassCastException的错误。

    你认为我的语法有问题,还是来自Xtext方面的错误?

    其他信息

    我反对这种情况已经有好几天了,我收集了一些有趣的信息:

    • 在该示例中,编辑器仅在编辑顶级列表中的元素时抛出,而不是从内部列表编辑元素(参见example2变量)
    • 在我的测试中,有时会在调用堆栈中抛出NullPointerException
      • 我怀疑方法PartialParsingHelper.reparse(IParser parser, IParseResult prev, ReplaceRegion cr)有一种奇怪的行为
      • 此方法找到模型中当前修改元素的父元素,使用新值调用此元素的eSet()。但在我们的情况下,它会尝试拨打Statemachine.eSet()而不是Variable.eSet()
      • ClassCastException来自相同的功能ID:
        • StateMachine.vars的功能ID == 0
        • Variable.value的功能ID == 0
        • 但是2个功能的类型不一样
      • 如果我在Variable中添加一些BEFORE值功能,则抛出的异常(较早)为NullPointerException,因为Variable.value在{{1}时具有功能ID == 2或3只有2个功能(0和1)

    错误的StackTrace:

    StateMachine

2 个答案:

答案 0 :(得分:1)

xText bugzilla中已经有一个bugifix。它是org.eclipse.parser.impl.PartialParsingHelper的补丁。解决问题:

  1. the patch获取文件。
  2. 将内容放在xText项目的单独类中
  3. 通过覆盖RuntimeModule中的public Class bindIPartialParserHelper()来注册此类(项目中的geenrated类,扩展org.eclipse.xtext.service.DefaultRuntimeModule)
  4. 问题在于重新解析已经解析过的语言部分:旧元素的父容器未正确设置。新元素与旧元素链接,而不是旧元素的父元素。

    我猜你自己已经知道这个了,但是这个说明可能会帮助下一个有同样问题的人。

答案 1 :(得分:0)

Xtext团队确认这是2.4.x版本的错误。有关错误修正的更多详细信息和通知,请参阅the related issue