Skip to content

Commit

Permalink
feat: Improve rule detection
Browse files Browse the repository at this point in the history
  • Loading branch information
egore committed Jun 22, 2023
1 parent c241834 commit d82235a
Show file tree
Hide file tree
Showing 2 changed files with 38 additions and 14 deletions.
46 changes: 35 additions & 11 deletions parser/src/main/antlr/libldt3/ruleparser/Kontext.g4
Original file line number Diff line number Diff line change
Expand Up @@ -2,46 +2,58 @@ grammar Kontext;

fragment DIGIT: '0'..'9';
INTEGER: DIGIT+;
WS : (' '|'\t')+ -> skip;
WS : (' '|'\t'|''|''|'')+ -> skip;

DARF: 'darf';
ENTWEDER: 'Entweder';
ES_KANN_ENTWEDER : 'Es kann entweder' ;
FK: 'FK';
FELDINHALT_VON: 'Feldinhalt von';
INHALT_VON: 'Inhalt von';
IST_VORHADEN: 'ist vorhanden';
KANN: 'kann';
KOMMA: ',';
MUSS: 'muss';
ODER: 'oder';
PUNKT: '.';
UND: 'und';
WENN: 'Wenn';

objekt:
'Obj_' INTEGER ('(Obj_' ('Untersuchungsabrechnung'|'Laborergebnisbericht'|'Untersuchungsanforderung'|'Untersuchungsergebnis Mikrobiologie'|'Einsenderidentifikation'|'Betriebsstätte'|'Abrechnung GKV'|'Obj_Tier/Sonstiges') ')')?;

imObjekt:
('im'|'in') objekt;

// Field identifier
fk:
FK INTEGER;

undOder:
(UND|ODER|'und/oder'|',');

fkInitialized:
fk values?;

// Field with one or multiple values
fkAssignment:
fk '=' values?;
fk ('='|''|'ungleich') values?;

// Fragement: one and/or multiple values
values:
INTEGER (KOMMA INTEGER)* ((UND|ODER) INTEGER)*;
(objekt|INTEGER) (KOMMA INTEGER)* (undOder INTEGER)*;

// Fragment: one and/or multiple fields exist
exists:
'die'? fk ((UND|ODER) fk)+ existsAlternatives;
'die'? fk (undOder fk)+ existsAlternatives;

// Fragment: one and/or multiple fields have a given content
inhalt:
(FELDINHALT_VON|INHALT_VON|'der Inhalt') fkAssignment 'ist'?;
(FELDINHALT_VON|INHALT_VON|'der Inhalt')? fkAssignment 'ist'?;

// Fragment: Alternative was of specifying a field exists
existsAlternatives:
(IST_VORHADEN|'vorkommen'|'vorhanden'|'vorhanden sein'|'vorhanden ist') ;
(IST_VORHADEN|'vorkommen'|'vorhanden'|'vorhanden sein'|'vorhanden ist'|'mindestens einmal vorkommen'|'vorhanden sind') ;

// Rule: Either one of the 'fields' exists
eitherExists:
Expand All @@ -53,18 +65,30 @@ exclusion:

// Fragment: Either fields exist or have a specific content
inhaltExists:
(inhalt|exists) ((UND|ODER) (inhalt|exists))*;
(inhalt|exists) (undOder (inhalt|exists))*;

ifContent:
(WENN|'Nur wenn'|'wenn') imObjekt? inhaltExists;

ifRuleMust:
WENN inhaltExists KOMMA? 'dann'? 'muss' fk 'auch'? existsAlternatives PUNKT?;
ifContent KOMMA? 'dann'? MUSS fk 'mindestens einmal'? imObjekt? 'auch'? existsAlternatives PUNKT?;

ifRuleMay:
WENN inhaltExists KOMMA? 'dann'? 'kann' fk 'auch'? existsAlternatives PUNKT?;
ifContent KOMMA? 'dann'? KANN fk imObjekt? 'auch'? existsAlternatives PUNKT?;

ifRuleMustNot:
WENN inhaltExists KOMMA? 'dann'? 'darf' fk ('nicht vorkommen'|'nicht vorhanden'|'nicht vorhanden sein') PUNKT?;
ifContent KOMMA? 'dann'? DARF fk imObjekt? ('nicht vorkommen'|'nicht vorhanden'|'nicht vorhanden sein'|'nicht vorhanden ist') PUNKT?;

ifRuleMayInverted:
fk DARF imObjekt? ('nur vorhanden sein'|'nur vorkommen') KOMMA? 'wenn' inhalt imObjekt existsAlternatives PUNKT?;

ifRuleCanInverted:
fk imObjekt? KANN imObjekt? ('nur vorhanden sein'|'nur vorkommen') KOMMA? ifContent PUNKT?;

ifRuleCanNotInverted:
fk imObjekt? KANN imObjekt? ('nur vorhanden sein'|'nur vorkommen') KOMMA? fk imObjekt? ('nicht vorkommen'|'nicht vorhanden'|'nicht vorhanden sein'|'nicht vorhanden ist') PUNKT?;

// Top level rule
regel:
(eitherExists | ifRuleMust | ifRuleMay | ifRuleMustNot)+;
(eitherExists | ifRuleMust | ifRuleMay | ifRuleMustNot | ifRuleMayInverted | ifRuleCanInverted | ifRuleCanNotInverted)+;

6 changes: 3 additions & 3 deletions parser/src/main/java/libldt3/parser/model/Kontextregel.java
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,7 @@ public void exitIfRuleMust(KontextParser.IfRuleMustContext ctx) {
MustRule rule = new MustRule();
rule.comment = getSpacedText(ctx);
// Workaround for incomplete parsing
extracted(ctx.inhaltExists().inhalt(), rule);
extracted(ctx.ifContent().inhaltExists().inhalt(), rule);
// Workaround for incomplete parsing
if (ctx.fk() != null) {
String fk = ctx.fk().INTEGER().toString();
Expand All @@ -104,7 +104,7 @@ public void exitIfRuleMay(KontextParser.IfRuleMayContext ctx) {
MustRule rule = new MustRule();
rule.comment = getSpacedText(ctx);
// Workaround for incomplete parsing
extracted(ctx.inhaltExists().inhalt(), rule);
extracted(ctx.ifContent().inhaltExists().inhalt(), rule);
// Workaround for incomplete parsing
if (ctx.fk() != null) {
String fk = ctx.fk().INTEGER().toString();
Expand Down Expand Up @@ -153,7 +153,7 @@ public void exitIfRuleMustNot(KontextParser.IfRuleMustNotContext ctx) {
rule.comment = getSpacedText(ctx);
rule.inverted = true;
// Workaround for incomplete parsing
extracted(ctx.inhaltExists().inhalt(), rule);
extracted(ctx.ifContent().inhaltExists().inhalt(), rule);
// Workaround for incomplete parsing
if (ctx.fk() != null) {
String fk = ctx.fk().INTEGER().toString();
Expand Down

0 comments on commit d82235a

Please sign in to comment.