単純なことかもしれませんが、いくらコーヒーを飲んでも脳が活性化しません。
次のパターンを ANTLR と一致させる必要があります。
5 YEARS
5 YEARS 2 MONTHS
5 YEARS 2 MONTHS 3 DAYS
2 MONTHS 3 DAYS
5 YEARS 3 DAYS
etc
そこで、次のルールから始めました。
atom returns [Object value]
// start w/ a duration. Returned value will be a Joda Period object
: (INTEGER ('YEAR'|'YEARS'))? (INTEGER ('MONTH'|'MONTHS'))? (INTEGER ('DAY'|'DAYS')?
;
明らかにそれはうまくいきません。私はこれが単純であることを知っていますが、私は現時点で404の主要な脳を持っています.
(ルールを正しく理解したら、定義をレクサー定義に移動します)
更新: 以前に提供された入力のおかげで、次のルールセットが機能します。再度、感謝します。
datePeriod returns [Object value]
: year month? week? day? EOF
{
$value = new Period($year.num, $month.num, $week.num, $day.num,0,0,0,0);
}
| month week? day? EOF
{
$value = new Period(0, $month.num, $week.num, $day.num,0,0,0,0);
}
| week day? EOF
{
$value = new Period(0,0, $week.num, $day.num,0,0,0,0);
}
| day EOF
{
$value = new Period(0, 0, 0, $day.num,0,0,0,0);
}
;
year returns [int num]
: INTEGER YEAR
{
$num = $INTEGER.int;
}
;
month returns [int num]
: INTEGER MONTH
{
$num = $INTEGER.int;
}
;
week returns [int num]
: INTEGER WEEK
{
$num = $INTEGER.int;
}
;
day returns [int num]
: INTEGER DAY
{
$num = $INTEGER.int;
}
;
YEAR: ('YEAR'|'YEARS');
MONTH: ('MONTH'|'MONTHS');
WEEK: ('WEEK'|'WEEKS');
DAY: ('DAY'|'DAYS');
残念ながら、ANTLR IDEA は次のような警告を表示しています。
Decision can match input such as "INTEGER MONTH" using multiple alternatives: 1, 2
ジェイソン