Skip to content

Commit 037595a

Browse files
authored
Merge pull request #91 from snipsco/task/improve-grammars
Improve grammars
2 parents d2fddef + e2247c1 commit 037595a

File tree

6 files changed

+187
-51
lines changed

6 files changed

+187
-51
lines changed

grammar/de/src/rules.rs

Lines changed: 120 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -533,15 +533,15 @@ pub fn rules_time(b: &mut RuleSetBuilder<Dimension>) -> RustlingResult<()> {
533533
|_| helpers::month(12)
534534
);
535535
b.rule_1_terminal("christmas",
536-
b.reg(r#"weih?nacht(?:en|s(?:feier)?tag)?"#)?,
536+
b.reg(r#"christtag|weih?nacht(?:en|s(?:feier)?tag)?"#)?,
537537
|_| helpers::month_day(12, 25)
538538
);
539539
b.rule_1_terminal("christmas eve",
540-
b.reg(r#"heilig(er)? abend"#)?,
540+
b.reg(r#"christnacht|(?:heilig(?:e[r|n])?|weihnachts) ?abend"#)?,
541541
|_| helpers::month_day(12, 24)
542542
);
543543
b.rule_1_terminal("three wise men",
544-
b.reg(r#"den heiligen drei k[öo]nigen"#)?,
544+
b.reg(r#"(?:den )heiligen? drei k[öo]nigen?"#)?,
545545
|_| helpers::month_day(1, 6)
546546
);
547547
b.rule_1_terminal("new year's eve",
@@ -576,7 +576,16 @@ pub fn rules_time(b: &mut RuleSetBuilder<Dimension>) -> RustlingResult<()> {
576576
b.reg(r#"palmsonntag"#)?,
577577
|_| Ok(helpers::cycle_nth_after(Grain::Day, -7, &helpers::easter()?)?.form(Form::Celebration)),
578578
);
579-
579+
b.rule_1_terminal("Holy Thursday",
580+
b.reg(r#"gr[üu]ndonnerstag"#)?,
581+
|_| Ok(helpers::cycle_nth_after(Grain::Day, -3, &helpers::easter()?)?
582+
.form(Form::Celebration))
583+
);
584+
b.rule_1_terminal("Good Friday",
585+
b.reg(r#"karfreitag"#)?,
586+
|_| Ok(helpers::cycle_nth_after(Grain::Day, -2, &helpers::easter()?)?
587+
.form(Form::Celebration))
588+
);
580589
b.rule_1_terminal("Lent",
581590
b.reg(r#"(?:in|w[aä]hrend) der fastenzeit"#)?,
582591
|_| Ok(helpers::cycle_nth_after(Grain::Day, -47, &helpers::easter()?)?
@@ -590,6 +599,33 @@ pub fn rules_time(b: &mut RuleSetBuilder<Dimension>) -> RustlingResult<()> {
590599
.span_to(&helpers::cycle_nth_after(Grain::Day, -47, &helpers::easter()?)?, false)?
591600
.form(Form::Celebration))
592601
);
602+
b.rule_1_terminal("Easter",
603+
b.reg(r#"oster(?:n|sonntag)"#)?,
604+
|_| Ok(helpers::easter()?
605+
.form(Form::Celebration))
606+
);
607+
b.rule_1_terminal("Easter Monday",
608+
b.reg(r#"ostermontag"#)?,
609+
|_| Ok(helpers::cycle_nth_after(Grain::Day, 1, &helpers::easter()?)?
610+
.form(Form::Celebration))
611+
);
612+
b.rule_1_terminal("ascension",
613+
b.reg(r#"himmelfahrt|auffahrt"#)?,
614+
|_| Ok(helpers::cycle_nth_after(Grain::Day, 39, &helpers::easter()?)?
615+
.form(Form::Celebration))
616+
617+
);
618+
b.rule_1_terminal("Pencost",
619+
b.reg(r#"pfingst(?:en|sonntag)"#)?,
620+
|_| Ok(helpers::cycle_nth_after(Grain::Day, 49, &helpers::easter()?)?
621+
.form(Form::Celebration))
622+
);
623+
624+
b.rule_1_terminal("Pencost Monday",
625+
b.reg(r#"pfingstmontag"#)?,
626+
|_| Ok(helpers::cycle_nth_after(Grain::Day, 50, &helpers::easter()?)?
627+
.form(Form::Celebration))
628+
);
593629

594630
b.rule_1_terminal("valentine's day",
595631
b.reg(r#"valentin'?stag"#)?,
@@ -619,46 +655,54 @@ pub fn rules_time(b: &mut RuleSetBuilder<Dimension>) -> RustlingResult<()> {
619655
b.reg(r#"allerheiligen(?:tag)?"#)?,
620656
|_| Ok(helpers::month_day(11, 1)?.form(Form::Celebration))
621657
);
622-
b.rule_1_terminal("Saint Joseph",
658+
b.rule_1_terminal("Holy Joseph",
623659
b.reg(r#"sankt josef"#)?,
624660
|_| Ok(helpers::month_day(3, 19)?.form(Form::Celebration))
625661
);
626-
b.rule_1_terminal("Saint Florian",
662+
b.rule_1_terminal("Holy Florian",
627663
b.reg(r#"sankt florian"#)?,
628664
|_| Ok(helpers::month_day(5, 4)?.form(Form::Celebration))
629665
);
630-
b.rule_1_terminal("Saint Rupert",
666+
b.rule_1_terminal("Holy Rupert",
631667
b.reg(r#"sankt rupert"#)?,
632668
|_| Ok(helpers::month_day(9, 24)?.form(Form::Celebration))
633669
);
634670
b.rule_1_terminal("German national celebration",
635-
b.reg(r#"tag (?:der)? deutsc?hen? einheit"#)?,
671+
b.reg(r#"tag (?:der )?deutsc?hen? einheit"#)?,
636672
|_| Ok(helpers::month_day(10, 3)?.form(Form::Celebration))
637673
);
638674
b.rule_1_terminal("Day of popular vote",
639675
b.reg(r#"tag der volksabtimmun"#)?,
640676
|_| Ok(helpers::month_day(10, 10)?.form(Form::Celebration))
641677
);
642678
b.rule_1_terminal("Austrian national celebration",
643-
b.reg(r#"([öo]sterreichischer?)? nationalfeiertag|national feiertag"#)?,
679+
b.reg(r#"(?:[öo]sterreichischer? )?nationalfeiertag|national feiertag"#)?,
644680
|_| Ok(helpers::month_day(10, 26)?.form(Form::Celebration))
645681
);
646682
b.rule_1_terminal("Armistice Celebration",
647683
b.reg(r#"waffenstillstandserkl[äa]rung"#)?,
648684
|_| Ok(helpers::month_day(11, 11)?.form(Form::Celebration))
649685
);
650-
b.rule_1_terminal("Saint Martin",
651-
b.reg(r#"sankt martin"#)?,
686+
b.rule_1_terminal("Holy Martin",
687+
b.reg(r#"sankt martin|martinstag"#)?,
652688
|_| Ok(helpers::month_day(11, 11)?.form(Form::Celebration))
653689
);
654-
b.rule_1_terminal("Saint Leopold",
690+
b.rule_1_terminal("Holy Leopold",
655691
b.reg(r#"sankt leopold"#)?,
656692
|_| Ok(helpers::month_day(11, 15)?.form(Form::Celebration))
657693
);
694+
b.rule_1_terminal("Holy Joseph",
695+
b.reg(r#"josefstag"#)?,
696+
|_| Ok(helpers::month_day(3, 19)?.form(Form::Celebration))
697+
);
658698
b.rule_1_terminal("Switzerland national celebration",
659699
b.reg(r#"an der bundesfeier"#)?,
660700
|_| Ok(helpers::month_day(8, 1)?.form(Form::Celebration))
661701
);
702+
b.rule_1_terminal("Berchtoldstag",
703+
b.reg(r#"berchtoldstag"#)?,
704+
|_| Ok(helpers::month_day(1, 2)?.form(Form::Celebration))
705+
);
662706
b.rule_1_terminal("Immaculate conception",
663707
b.reg(r#"mari[äa] empf[äa]ngnis"#)?,
664708
|_| Ok(helpers::month_day(12, 8)?.form(Form::Celebration))
@@ -671,19 +715,12 @@ pub fn rules_time(b: &mut RuleSetBuilder<Dimension>) -> RustlingResult<()> {
671715
b.reg(r#"(?:internationale[rnm] )?frauentag"#)?,
672716
|_| Ok(helpers::month_day(3, 8)?.form(Form::Celebration))
673717
);
674-
// TODO needs the lunar calendar feature
675-
// b.rule_1("Ascension celebration",
676-
// b.reg(r#"himmelfahrt"#)?,
677-
// |_|
678-
// );
679718

680-
// TODO in Germany it is the same day as the ascension celebration
681-
// b.rule_1("Father's Day", // third Sunday of June
682-
// b.reg(r#"vatt?er(?: ?tag)?|(?:herren|m[äa]nner)tag"#)?,
683-
// |_| helpers::day_of_week(Weekday::Sun)?
684-
// .intersect(&helpers::month(6)?)?
685-
// .intersect(&helpers::cycle_nth_after(Grain::Week, 2, &helpers::month_day(6, 1)?)?)
686-
// );
719+
b.rule_1("Father's Day", // third Sunday of June
720+
b.reg(r#"vatt?er(?: ?tag)?|(?:herren|m[äa]nner)tag"#)?,
721+
|_| Ok(helpers::cycle_nth_after(Grain::Day, 39, &helpers::easter()?)?
722+
.form(Form::Celebration))
723+
);
687724
b.rule_1_terminal("Mother's Day",
688725
b.reg(r#"mutt?ertag|mutt?er (?:tag)?"#)?,
689726
|_| Ok(helpers::day_of_week(Weekday::Sun)?
@@ -699,6 +736,13 @@ pub fn rules_time(b: &mut RuleSetBuilder<Dimension>) -> RustlingResult<()> {
699736
b.reg(r#"allerheiligen?|aller heiligen?"#)?,
700737
|_| Ok(helpers::month_day(11, 1)?.form(Form::Celebration))
701738
);
739+
b.rule_1_terminal("Sunday of the dead (German protestant)",
740+
b.reg(r#"totensonntag"#)?,
741+
|_| Ok(helpers::day_of_week(Weekday::Sun)?
742+
.intersect(&helpers::cycle_nth_after(Grain::Week, 3, &helpers::month_day(11, 1)?)?)?
743+
.form(Form::Celebration))
744+
);
745+
702746
b.rule_1_terminal("Nikolaus",
703747
b.reg(r#"nikolaus(?: ?tag|abend)?|nikolo"#)?,
704748
|_| Ok(helpers::month_day(12, 6)?.form(Form::Celebration))
@@ -715,9 +759,21 @@ pub fn rules_time(b: &mut RuleSetBuilder<Dimension>) -> RustlingResult<()> {
715759
.form(Form::Celebration))
716760
}
717761
);
762+
//Volkstrauertag
763+
764+
b.rule_1_terminal("memorial day",
765+
b.reg(r#"volkstrauertag"#)?,
766+
|_| {
767+
let christmas = helpers::month_day(12, 25)?;
768+
let offset = -6;
769+
Ok(helpers::cycle_nth_after(Grain::Week, offset, &christmas)?
770+
.intersect(&helpers::day_of_week(Weekday::Sun)?)?
771+
.form(Form::Celebration))
772+
}
773+
);
718774

719775
b.rule_1_terminal("now",
720-
b.reg(r#"(?:genau ?)?jetzt|(?:diesen|im|in diesem) (?:moment|augenblick)|nun|sofort|gerade (?:eben|jetzt)"#)?,
776+
b.reg(r#"(?:genau ?)?jetzt|aktuelle(?:r|n|s|m)?|gegenw[äa]rtige(?:r|n|s|m)?|(?:diesen|im|in diesem) (?:moment|augenblick)|nun|sofort|gerade (?:eben|jetzt)"#)?,
721777
|_| helpers::cycle_nth(Grain::Second, 0)
722778
);
723779
b.rule_1_terminal("today",
@@ -899,10 +955,29 @@ pub fn rules_time(b: &mut RuleSetBuilder<Dimension>) -> RustlingResult<()> {
899955
ordinal_check!(|ordinal: &OrdinalValue| 1 <= ordinal.value && ordinal.value <= 31),
900956
|time, ordinal| time.value().intersect(&helpers::day_of_month(ordinal.value().value as u32)?)
901957
);
902-
b.rule_2("<named-month> <day-of-month> (non ordinal)",
958+
b.rule_3("<named-month> <day-of-month> (non ordinal) <time>",
903959
time_check!(form!(Form::Month(_))),
904960
integer_check_by_range!(1, 31),
905-
|time, integer| time.value().intersect(&helpers::day_of_month(integer.value().value as u32)?)
961+
time_check!(),
962+
|month, integer, time| month.value()
963+
.intersect(&helpers::day_of_month(integer.value().value as u32)?)?
964+
.intersect(time.value())
965+
);
966+
b.rule_3("<time> <named-month> <day-of-month> (non ordinal)",
967+
time_check!(),
968+
time_check!(form!(Form::Month(_))),
969+
integer_check_by_range!(1, 31),
970+
|time, month, integer| month.value()
971+
.intersect(&helpers::day_of_month(integer.value().value as u32)?)?
972+
.intersect(time.value())
973+
);
974+
b.rule_3("<day-of-week> <named-month> <day-of-month> (non ordinal)",
975+
time_check!(form!(Form::DayOfWeek{..})),
976+
time_check!(form!(Form::Month(_))),
977+
integer_check_by_range!(1, 31),
978+
|dow, month, integer| month.value()
979+
.intersect(&helpers::day_of_month(integer.value().value as u32)?)?
980+
.intersect(dow.value())
906981
);
907982
b.rule_3("<day-of-month> (non ordinal) of <named-month>",
908983
integer_check_by_range!(1, 31),
@@ -1131,6 +1206,14 @@ pub fn rules_time(b: &mut RuleSetBuilder<Dimension>) -> RustlingResult<()> {
11311206
.span_to(&helpers::hour(12, false)?, false)?
11321207
.form(Form::PartOfDay(PartOfDayForm::Morning)))
11331208
);
1209+
1210+
b.rule_1_terminal("morning (latent)",
1211+
b.reg(r#"fr[üu]h"#)?,
1212+
|_| Ok(helpers::hour(3, false)?
1213+
.span_to(&helpers::hour(12, false)?, false)?
1214+
.latent()
1215+
.form(Form::PartOfDay(PartOfDayForm::Morning)))
1216+
);
11341217
b.rule_1_terminal("late morning",
11351218
b.reg(r#"(?:kurz|am sp[äa]ten) vor ?mittag"#)?,
11361219
|_| Ok(helpers::hour(11, false)?
@@ -1331,7 +1414,7 @@ pub fn rules_time(b: &mut RuleSetBuilder<Dimension>) -> RustlingResult<()> {
13311414
);
13321415

13331416
b.rule_2("<article> <time>",
1334-
b.reg(r#"a[nm]"#)?,
1417+
b.reg(r#"a[nm](?: de[rn])?"#)?,
13351418
time_check!(excluding_form!(Form::TimeOfDay(_))),
13361419
|_, time| Ok(time.value().clone().not_latent())
13371420
);
@@ -1735,12 +1818,12 @@ pub fn rules_temperature(b: &mut RuleSetBuilder<Dimension>) -> RustlingResult<()
17351818
// );
17361819

17371820
b.rule_2("<article> temp",
1738-
b.reg(r#"bei"#)?,
1739-
temperature_check!(),
1821+
b.reg(r#"bei|auf"#)?,
1822+
temperature_check!(|temp: &TemperatureValue| !temp.latent),
17401823
|_, temp| Ok(TemperatureValue {
17411824
value: temp.value().value,
17421825
unit: temp.value().unit,
1743-
latent: false,
1826+
latent: temp.value().latent,
17441827
})
17451828
);
17461829
b.rule_1("number as temp",
@@ -1865,6 +1948,12 @@ pub fn rules_numbers(b: &mut RuleSetBuilder<Dimension>) -> RustlingResult<()> {
18651948
number_check!(),
18661949
|a, b| helpers::compose_numbers(&a.value(), &b.value()));
18671950

1951+
b.rule_3("intersect",
1952+
number_check!(|number: &NumberValue| number.grain().unwrap_or(0) > 1),
1953+
b.reg(r#"und"#)?,
1954+
number_check!(),
1955+
|a, _, b| helpers::compose_numbers(&a.value(), &b.value()));
1956+
18681957
b.rule_1_terminal("null",
18691958
b.reg(r#"kein(?:er|en|e?s?)|null|nichts"#)?,
18701959
|_| IntegerValue::new(0)

grammar/de/src/training.rs

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -58,28 +58,26 @@ pub fn examples_time(v: &mut Vec<::rustling::train::Example<Dimension>>) {
5858
example!(v, check_moment!(c, [2013, 2, 11]), "gestern");
5959
example!(v, check_moment!(c, [2013, 2, 13]), "morgen");
6060
example!(v, check_moment!(c, [2013, 2, 18]), "montag", "mo.", "diesen montag");
61-
example!(v, check_moment!(c, [2013, 2, 18]), "Montag, Feb 18", "Montag, Februar 18");
61+
example!(v, check_moment!(c, [2013, 2, 18]), "Montag Feb 18", "Montag Februar 18");
6262
example!(v, check_moment!(c, [2013, 2, 19]), "dienstag");
6363
example!(v, check_moment!(c, [2013, 2, 14]), "donnerstag", "do", "do.");
6464
example!(v, check_moment!(c, [2013, 2, 15]), "freitag", "fr.");
6565
example!(v, check_moment!(c, [2013, 2, 16]), "samstag", "sa.");
6666
example!(v, check_moment!(c, [2013, 2, 17]), "sonntag", "so.");
6767
example!(v, check_moment!(c, [2013, 3, 1]), "1 märz", "erster märz");
68-
example!(v, check_moment!(c, [2013, 3, 3]), "märz 3");
6968
example!(v, check_moment!(c, [2015, 3, 3]), "märz 3 2015");
7069
example!(v, check_moment!(c, [2013, 2, 15]), "am 15ten");
71-
example!(v, check_moment!(c, [2013, 2, 15]), "15. februar", "februar 15", "15te februar", "15.2.", "am 15.2.", "februar 15");
72-
example!(v, check_moment!(c, [2013, 8, 8]), "Aug 8");
70+
example!(v, check_moment!(c, [2013, 2, 15]), "15. februar", "15te februar", "15.2.", "am 15.2.");
7371
example!(v, check_moment!(c, [2014, 10]), "Oktober 2014");
7472
example!(v, check_moment!(c, [1974, 10, 31]), "31.10.1974", "31.10.74");
75-
example!(v, check_moment!(c, [2015, 4, 14]), "14 april 2015", "April 14, 2015", "14te April 15");
73+
example!(v, check_moment!(c, [2015, 4, 14]), "14 april 2015", "April 14 2015", "14te April 15");
7674
example!(v, check_moment!(c, [2013, 2, 19]), "nächsten dienstag");
7775
example!(v, check_moment!(c, [2013, 2, 22]), "übernächsten freitag");
7876
example!(v, check_moment!(c, [2013, 3]), "nächsten marz");
7977
example!(v, check_moment!(c, [2014, 3]), "übernächsten marz");
80-
example!(v, check_moment!(c, [2013, 2, 10]), "Sonntag, Feb 10");
81-
example!(v, check_moment!(c, [2013, 2, 13]), "Mittwoch, Feb 13");
82-
example!(v, check_moment!(c, [2013, 2, 18]), "Montag, Feb 18");
78+
example!(v, check_moment!(c, [2013, 2, 10]), "Sonntag Feb 10");
79+
example!(v, check_moment!(c, [2013, 2, 13]), "Mittwoch Feb 13");
80+
example!(v, check_moment!(c, [2013, 2, 18]), "Montag Feb 18");
8381
example!(v, check_moment!(c, [2013, 2, 11], Grain::Week), "diese woche");
8482
example!(v, check_moment!(c, [2013, 2, 18], Grain::Week), "kommende woche");
8583
example!(v, check_moment!(c, [2013, 2, 4], Grain::Week), "letzte woche");
@@ -194,8 +192,8 @@ pub fn examples_time(v: &mut Vec<::rustling::train::Example<Dimension>>) {
194192
example!(v, check_moment_span!(c, [2013, 3], [2013, 6]), "nächsten 3 monaten", "nächste drei monate", "kommenden drei monaten");
195193
example!(v, check_moment_span!(c, [2011], [2013]), "letzten 2 jahren", "letzten zwei jahre", "vergangenen zwei jahren");
196194
example!(v, check_moment_span!(c, [2014], [2017]), "nächsten 3 jahren", "kommenden drei jahren", "nächste drei jahre");
197-
example!(v, check_moment_span!(c, [2013, 7, 13], [2013, 7, 16]), "13. - 15. Juli", "13ter bis 15ter Juli", "13 bis 15 Juli", "13 - 15 Juli", "Juli 13 - Juli 15");
198-
example!(v, check_moment_span!(c, [2013, 8, 8], [2013, 8, 13]), "Aug 8 - Aug 12");
195+
example!(v, check_moment_span!(c, [2013, 7, 13], [2013, 7, 16]), "13. - 15. Juli", "13ter bis 15ter Juli", "13 bis 15 Juli", "13 - 15 Juli", "13 Juli - 15 Juli");
196+
example!(v, check_moment_span!(c, [2013, 8, 8], [2013, 8, 13]), "8 Aug - 12 Aug");
199197
example!(v, check_moment_span!(c, [2013, 2, 12, 9, 30], [2013, 2, 12, 11, 1]), "9:30 - 11:00");
200198
example!(v, check_moment_span!(c, [2013, 2, 14, 9, 30], [2013, 2, 14, 11, 1]),"am Donnerstag von 9:30 - 11:00", "am Donnerstag zwischen 9:30 und 11:00", "Donnerstag 9:30 - 11:00", "am Donnerstag nach 9:30 aber vor 11:00", "Donnerstag von 9:30 bis 11:00");
201199
example!(v, check_moment_span!(c, [2013, 2, 14, 9], [2013, 2, 14, 12]), "Donnerstag Vormittag von 9 bis 11");

0 commit comments

Comments
 (0)