0

私が望むのは、日付の 3 つのコンポーネントを解析し、それぞれを独自の注釈に格納してから、日付全体を表す複雑な構造を作成することです。以下を試してみましたが、うまくいきませんでした。

DECLARE Annotation CommDate (Annotation CMonth, Annotation CDate, Annotation CYear);    
DECLARE Annotation CommenceMonth;
DECLARE Annotation CommenceYear;
DECLARE Annotation CommenceDate;

    NUM{REGEXP("[0-3]?[0-9]?") -> MARK(CommenceMonth)};
    CommenceMonth SPECIAL NUM{REGEXP("[0-3]?[0-9]?") -> MARK(CommenceDate)};
    CommenceDate SPECIAL NUM{REGEXP("19..|20..") -> MARK(CommenceYear)};

    CommenceMonth CommenceDate CommenceYear {-> CREATE(CommDate, 1,2,3, "CMonth" = 1, "CDate" = 2,  "CYear" = 3) };

「12/31/2014」のようなものをフィードすると、3 つの CommenceXXX 注釈に値が割り当てられますが、複雑な構造の CommDate には値が割り当てられません。

4

1 に答える 1

1

最初の問題は、複雑な注釈を作成するための最後のルールでスラッシュ (SPECIAL) が抜けていたことです。スラッシュは他の注釈の一部ではないため、最後のルールは後続の CommenceDate には一致しません。まだスラッシュがないためです。注釈 CommenceDate および CommenceYear にスラッシュが含まれている場合、または最後のルールにシーケンシャル パターンにスラッシュが含まれている場合、ルールは機能しますCommenceMonth SPECIAL CommenceDate SPECIAL CommenceYear...

2 つ目の問題は、CREATE アクションの間違った使い方です。フィーチャのアノテーション値は、タイプを使用して CREATE アクションで割り当てられます。これは、このアクションが一致したコンテキスト内でアノテーションを見つけようとするためです。ルール要素のインデックスは、一致したルール要素のコンテキスト外でアノテーションを割り当てるために GATHER アクションで使用されます。

たとえば、問題を解決するために次の方法で最後のルールを書き直すことができます。

アクション GATHER の使用:

CommenceMonth SPECIAL CommenceDate SPECIAL CommenceYear 
    {-> GATHER(CommDate, 1, 5, "CMonth" = 1, "CDate" = 3,  "CYear" = 5) };

アクション CREATE の使用:

CommenceMonth SPECIAL CommenceDate SPECIAL CommenceYear 
    {-> CREATE(CommDate, 1, 5, "CMonth" = CommenceMonth, "CDate" = CommenceDate,  "CYear" = CommenceYear) };

この例をよりコンパクトに表現すると、次のようになります (コード スタイルは少し異なりますが、パターンは同じです)。

DECLARE Month, Day, Year;
DECLARE Annotation Date (Month month, Day day, Year year);    
(NUM{REGEXP("[0-3]?[0-9]?") -> Month} SPECIAL NUM{REGEXP("[0-3]?[0-9]?")-> Day} 
  SPECIAL NUM{REGEXP("19..|20..") -> Year}){-> CREATE(Date, "month" = Month, "day" = Day, "year" = Year)};
于 2014-04-02T09:08:23.727 に答える