[英]ANTLR Matching Date Range
Okay, this is probably simple, but no matter how much coffee I apply, my brain isn't activating. 好的,这可能很简单,但是无论我喝多少咖啡,我的大脑都不会激活。
I need to match the following patterns with ANTLR: 我需要将以下模式与ANTLR匹配:
5 YEARS
5 YEARS 2 MONTHS
5 YEARS 2 MONTHS 3 DAYS
2 MONTHS 3 DAYS
5 YEARS 3 DAYS
etc
So, I started out with the following rule: 因此,我开始遵循以下规则:
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')?
;
Obviously that isn't going to work. 显然,这是行不通的。 I know this is simple, but I'm having a major brain 404 at the moment. 我知道这很简单,但目前我的大脑主要是404。
(Once I get the rule right, I'll move the definition down to the Lexer definitions) (一旦我确定了正确的规则,我将定义下移到Lexer定义)
Update: The following ruleset works, thanks to input provided previously. 更新:由于先前提供的输入,以下规则集有效。 Thanks again. 再次感谢。
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');
Unfortunately, I'm ANTLR IDEA is now tossing out warnings such as: 不幸的是,我是ANTLR IDEA现在发出警告,例如:
Decision can match input such as "INTEGER MONTH" using multiple alternatives: 1, 2
Jason 杰森
Below is a simple grammar that can parse the dates as you've described them. 下面是一个简单的语法,可以按照您描述的日期解析日期。 Note that the new-line character is non-trivial/not skipped because "4 YEARS\\n4 MONTHS" should parse as two dates unambiguously. 请注意,换行符不是平凡的/不会被跳过的,因为“ 4 YEARS \\ n4 MONTHS”应该明确地解析为两个日期。
grammar dates;
options {
language = Java;
output = AST;
}
parse
: '\n'* date ('\n'+ date)* '\n'* EOF
;
date
// start w/ a duration. Returned value will be a Joda Period object
: year month? day?
{System.out.println(String.format("\%dy \%dm \%dd", $year.num, $month.num, $day.num));}
| month day?
{System.out.println(String.format("0y \%dm \%dd", $month.num, $day.num));}
| day
{System.out.println(String.format("0y 0m \%dd", $day.num));}
;
year returns [int num]
: INTEGER YEAR
{$num = $INTEGER.int;}
;
month returns [int num]
: INTEGER MONTH
{$num = $INTEGER.int;}
;
day returns [int num]
: INTEGER DAY
{$num = $INTEGER.int;}
;
DAY : 'DAY' | 'DAYS'
;
MONTH
: 'MONTH' | 'MONTHS'
;
YEAR: 'YEAR' | 'YEARS'
;
INTEGER
: '0'
| ('1'..'9')('0'..'9')*
;
WS
: ('\t' | ' ' | '\r') {skip();}
;
Test input: 测试输入:
5 YEARS
5 YEARS 2 MONTHS
5 YEARS 2 MONTHS 3 DAYS
2 MONTHS 3 DAYS
5 YEARS 3 DAYS
7 DAYS
1 MONTH
Test output: 测试输出:
5y 0m 0d
5y 2m 0d
5y 2m 3d
0y 2m 3d
5y 0m 3d
0y 0m 7d
0y 1m 0d
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.