0

私は最初の Xtext プロジェクトを開始しましたが、相互参照で問題が発生しました (これがおそらく問題だと思います)。DatType、InterfaceDescription ルール、および Enumeration があります。私がやりたいことは、ユーザーが列挙型からデータ型を選択するか、新しいデータ型を定義できるようにすることで、インターフェイスを記述することです。

Enum は問題なく動作しますが、「datatype test1」で新しいデータ型を定義し、それを InterfaceDescription 内で使用すると、次のエラーが発生します: 'XtextReconcilerJob' で問題が発生しました。「XtextReconcileJon」中に内部エラーが発生しました。そして、それがエラー スタックです: http://pastebin.com/evFki2mB

    DataType:
        'datatype' name=ID ('mapto' mappedType = JAVAID)?
    ;

    Interface:
        interfaceType=InterfaceType name=ID datatype=([DataType]| DataTypeEnum)
    ;

enum InterfaceType:
    INLET = 'inlet' |
    OUTLET = 'outlet'
;

    DataTypeEnum:
        INT8 = 'int8' | INT16 = 'int16' | INT32 = 'int32' |
        DOUBLE = 'double' | SINGLE = 'single' | REAL = 'real' |
        BOOLEAN = 'boolean' | CHAR = 'char'
    ;

別のルールで DataType Cross-Reference を使用すると、次のように機能します。

ParamList:
    'param:' datatype=[DataType] name=ID
;

誰が問題を知っていますか?

4

1 に答える 1

3

文法にはいくつかの問題があり、それらが組み合わさってこの奇妙な動作を引き起こします。

  1. DataTypeEnum、その名前とは対照的にenum、いくつかの文字列値を表す可能性のある奇妙なオブジェクトではありません。これにより、エディターのインターフェイス ルールで代替タイプの割り当ての問題が隠されます。
  2. エディターを生成すると、いくつかの不可解なエラー メッセージが出力に表示されます。
    • error(208): ../org.xtext.example.mydsl/src-gen/org/xtext/example/mydsl/parser/antlr/internal/InternalMyDsl.g:447:1: The following token definitions can never be matched because prior tokens match the same input: RULE_ID
    • ebnf2 is not supported for CrossReference- これは、'|' などの拡張構造を意味します。参照を定義する場合、パターンは許可されません
  3. EMF には anと EObject の両方になるタイプがないため、キーワードを前に付けるDataTypeEnumと、データ型属性の定義がエディターでエラーになり、問題の場所が明らかになります。enumenum

最後に、実行時エラーは、生成されたパーサー/レクサー ツールに何かが欠けていて、結果のモデルも正しくないことが原因でした。

より建設的にするには、Java にマップされた型またはデータ型のいずれかを参照できる TypeReference 要素を定義して、問題のある行を置き換えることをお勧めします。次の方法で文法を拡張できます。

Interface:
        interfaceType=InterfaceType name=ID datatype=(TypeReference)
;

TypeReference:
    JavaTypeReference | DataTypeReference
;

JavaTypeReference:
    type = [DataType]
;

DataTypeReference:
    type = DataTypeEnum
;

enum DataTypeEnum:
        INT8 = 'int8' | INT16 = 'int16' | INT32 = 'int32' |
        DOUBLE = 'double' | SINGLE = 'single' | REAL = 'real' |
        BOOLEAN = 'boolean' | CHAR = 'char'
;

PS .: 構文解析、特にエラー回復を容易にするために、いくつかのキーワードを言語に追加することをお勧めします。詳細については、次のブログ投稿を参照してください: http://zarnekow.blogspot.hu/2012/11/xtext-corner-7-parser-error-recovery.html

于 2013-01-23T20:21:22.080 に答える