我想要的是解析日期的三个组成部分,将每个组成部分存储到自己的注释中,然后创建一个复杂的结构,它将代表整个日期。我尝试了以下方法,但它没有用。
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) };
当我用“2014年12月31日”之类的东西喂它时,尽管三个CommenceXXX注释都是赋值,但CommDate的复杂结构却没有。
答案 0 :(得分:1)
第一个问题是你创建复杂注释的最后一条规则错过了斜线(SPECIAL)。斜杠不是其他注释的一部分,因此最后一条规则无法在后续的CommenceDate上匹配,因为还没有,但是斜杠。如果注释CommenceDate和CommenceYear中包含斜杠,或者如果最后一个规则包含顺序模式中的斜杠,则该规则将起作用:CommenceMonth SPECIAL CommenceDate SPECIAL CommenceYear...
。
第二个问题是CREATE操作的错误使用。功能的注释值使用类型在CREATE操作中分配,因为此操作尝试在匹配的上下文中查找annoations。规则元素的索引在GATHER操作中用于在规则元素的匹配上下文之外分配annoations。
例如,您可以通过以下方式重写最后一条规则来解决问题:
使用动作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)};