3

私は xtext 2.4 を使用しています。私がやりたいのは、SQL のような構文です。私を混乱させるのは、どの要素を端末/データ型/パーサー規則として扱うべきかわからないことです。これまでのところ、関連する私の文法MyTermは次のとおりです。

Model:
    (terms += MyTerm ';')*
;

MyTerm:
    constant=MyConstant | variable?='?'| collection_literal=CollectionLiteral 
;

MyConstant
    : string=STRING 
    | number=MyNumber
    | date=MYDATE 
    | uuid=UUID 
    | boolean=MYBOOLEAN
    | hex=BLOB
;

MyNumber:
    int=SIGNINT | float=SIGNFLOAT
;


SIGNINT returns ecore::EInt:
    '-'? INT
;


SIGNFLOAT returns ecore::EFloat:
    '-'? INT '.' INT;
;

CollectionLiteral:
    => MapLiteral | SetLiteral | ListLiteral
;

MapLiteral:
    '{' {MapLiteral} (entries+=MapEntry (',' entries+=MapEntry)* )? '}'
;

MapEntry:
    key=MyTerm ':' value=MyTerm
;

SetLiteral:
    '{' {SetLiteral} (values+=MyTerm (',' values+=MyTerm)* )+ '}'
;

ListLiteral:
    '[' {ListLiteral} ( values+=MyTerm (',' values+=MyTerm)* )? ']'
;

terminal MYDATE:
  '0'..'9' '0'..'9' '0'..'9' '0'..'9' '-'
  '0'..'9' '0'..'9' '-'
  '0'..'9' '0'..'9'
;

terminal HEX:
    'a'..'h'|'A'..'H'|'0'..'9'
;   

terminal UUID:
    HEX HEX HEX HEX HEX HEX HEX HEX '-'
    HEX HEX HEX HEX '-'
    HEX HEX HEX HEX '-'
    HEX HEX HEX HEX '-'
    HEX HEX HEX HEX HEX HEX HEX HEX HEX HEX HEX HEX
;

terminal BLOB:
    '0' ('x'|'X') HEX+
;

terminal MYBOOLEAN returns ecore::EBoolean:
    'true' | 'false' | 'TRUE' | 'FALSE'
;

いくつかの質問:

  • 符号付き整数を定義するには? 別の最終ルールを定義するterminal SIGNINT: '-'? '0'..'9'+;と、antlr は INT が到達不能になると文句を言います。したがって、私はそれをデータ型ルールとして定義しますSIGNINT: '-'? INT;。これは正しい方法ですか?

  • 符号付きフロートを定義するには? define integer with sign, とまったく同じことをしましたがSIGNFLOAT: '-'? INT '.' INT;、これも正しいかどうかはわかりません。

  • 日付ルールを定義する方法 年/月/日の情報をフィールドに格納するためにパーサー ルールを使用したいのですが、MyDate: year=INT '-' month=INT '-' date=INT;antlr が文句を言うように定義します。Decision can match input such as "RULE_INT '-' RULE_INT '-' RULE_INT" using multiple alternatives: 2, 3 As a result, alternative(s) 3 were disabled for that input

  • 私はまた、次のようないくつかの他のルールを持っています

以下

RelationCompare:
    name=ID compare=COMPARE term=MyTerm
;

しかし、は sとして扱われるため、a=4有効ではありません。これを見つけたのは、関係を変更するとうまくいくからです。この投稿では、以前に定義された最終規則は、後で定義されたものを覆い隠すと述べています。ただし、文法を再定義すると、 の前後に配置しても、antlr は不平を言います。この問題も同様に発生します。は有効ですが、そうではありません。RelationComparea4HEXj=44terminal IDterminal HEXThe following token definitions can never be matched because prior tokens match the same input: RULE_HEX,RULE_MYBOOLEANk=0x00bk=0xaabk=0x00b

なにか提案を?

4

2 に答える 2