This is an automated email from the ASF dual-hosted git repository.
tkobayas pushed a commit to branch dev-new-parser
in repository https://gitbox.apache.org/repos/asf/incubator-kie-drools.git
The following commit(s) were added to refs/heads/dev-new-parser by this push:
new d80646294f [incubator-kie-drools-5808] [new-parser] Combining
DRLParser.g4 and DRL6Expressions.g4 (#5845)
d80646294f is described below
commit d80646294fc6a5b4d6281ef484c65747bd6d60ad
Author: Toshiya Kobayashi <[email protected]>
AuthorDate: Tue Apr 16 16:13:25 2024 +0900
[incubator-kie-drools-5808] [new-parser] Combining DRLParser.g4 and
DRL6Expressions.g4 (#5845)
* WIP: import DRL6Expressions.g4 into DRLParser.g4
- Removed conflicting rules to make the antlr4 goal successful.
- Java compilation fails because DRL6Expressions's @members section
injects a DRL6Expression constructor and method overrides into
DRLParser.java.
* [incubator-kie-drools-5808] [new-parser] Combining DRLParser.g4 and
DRL6Expressions.g4
- Modified DRL6Expressions.g4 @members to work with DRLParser
- Now DRLParser holds ParserHelper
- Fixed BigDecimal/BigInteger literal issues
* - Reverted some parser rules which are no longer required after
DRL6Expressions.g4 import
---------
Co-authored-by: Jiří Locker <[email protected]>
---
.../drl/parser/antlr4/MiscDRLParserTest.java | 5 +
.../drools/drl/parser/antlr4/DRL6Expressions.g4 | 10 +-
.../org/drools/drl/parser/antlr4/DRLParser.g4 | 147 +--------------------
.../drools/drl/parser/antlr4/DRLParserHelper.java | 6 +-
.../drools/drl/parser/antlr4/DRLVisitorImpl.java | 6 +-
.../drl/parser/antlr4/Drl6ExprParserAntlr4.java | 3 +-
6 files changed, 25 insertions(+), 152 deletions(-)
diff --git
a/drools-drl/drools-drl-parser-tests/src/test/java/org/drools/drl/parser/antlr4/MiscDRLParserTest.java
b/drools-drl/drools-drl-parser-tests/src/test/java/org/drools/drl/parser/antlr4/MiscDRLParserTest.java
index 2f98ddea42..14c30ca67c 100644
---
a/drools-drl/drools-drl-parser-tests/src/test/java/org/drools/drl/parser/antlr4/MiscDRLParserTest.java
+++
b/drools-drl/drools-drl-parser-tests/src/test/java/org/drools/drl/parser/antlr4/MiscDRLParserTest.java
@@ -42,6 +42,7 @@ import org.drools.drl.ast.descr.RuleDescr;
import org.drools.drl.ast.descr.TypeDeclarationDescr;
import org.drools.drl.ast.descr.TypeFieldDescr;
import org.drools.drl.ast.descr.WindowDeclarationDescr;
+import org.drools.drl.parser.impl.Operator;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Disabled;
@@ -4010,6 +4011,10 @@ class MiscDRLParserTest {
" list.add( \"E\" ); \n" +
" don( $t, E.class ); \n" +
"end\n";
+
+ Operator.addOperatorToRegistry("isA", false);
+ Operator.addOperatorToRegistry("isA", true);
+
PatternDescr pattern = (PatternDescr)
parseAndGetFirstRuleDescr(source).getLhs().getDescrs().get(0);
assertThat(pattern.getConstraint().getDescrs())
.extracting(Object::toString)
diff --git
a/drools-drl/drools-drl-parser/src/main/antlr4/org/drools/drl/parser/antlr4/DRL6Expressions.g4
b/drools-drl/drools-drl-parser/src/main/antlr4/org/drools/drl/parser/antlr4/DRL6Expressions.g4
index 348e8907a1..138f79ede2 100644
---
a/drools-drl/drools-drl-parser/src/main/antlr4/org/drools/drl/parser/antlr4/DRL6Expressions.g4
+++
b/drools-drl/drools-drl-parser/src/main/antlr4/org/drools/drl/parser/antlr4/DRL6Expressions.g4
@@ -30,12 +30,7 @@ options {
@members {
private ParserHelper helper;
- public DRL6Expressions(TokenStream input,
- ParserHelper helper ) {
- this( input );
- this.helper = helper;
- }
-
+ public void setHelper( ParserHelper helper ) { this.helper =
helper; }
public ParserHelper getHelper() { return helper;
}
public boolean hasErrors() { return
helper.hasErrors(); }
public List<DroolsParserException> getErrors() { return
helper.getErrors(); }
@@ -59,7 +54,6 @@ options {
public void setHasBindings( boolean value ) { this.hasBindings = value; }
public boolean hasBindings() { return this.hasBindings; }
- @Override
public final BaseDescr conditionalOrExpressionDescr() throws
RecognitionException {
return conditionalOrExpression().result;
}
@@ -101,8 +95,10 @@ literal
: STRING_LITERAL { helper.emit($STRING_LITERAL,
DroolsEditorType.STRING_CONST); }
| DRL_STRING_LITERAL { helper.emit($DRL_STRING_LITERAL,
DroolsEditorType.STRING_CONST); }
| DECIMAL_LITERAL { helper.emit($DECIMAL_LITERAL,
DroolsEditorType.NUMERIC_CONST); }
+ | DRL_BIG_INTEGER_LITERAL { helper.emit($DRL_BIG_INTEGER_LITERAL,
DroolsEditorType.NUMERIC_CONST); }
| HEX_LITERAL { helper.emit($HEX_LITERAL,
DroolsEditorType.NUMERIC_CONST); }
| FLOAT_LITERAL { helper.emit($FLOAT_LITERAL,
DroolsEditorType.NUMERIC_CONST); }
+ | DRL_BIG_DECIMAL_LITERAL { helper.emit($DRL_BIG_DECIMAL_LITERAL,
DroolsEditorType.NUMERIC_CONST); }
| BOOL_LITERAL { helper.emit($BOOL_LITERAL,
DroolsEditorType.BOOLEAN_CONST); }
| NULL_LITERAL { helper.emit($NULL_LITERAL,
DroolsEditorType.NULL_CONST); }
| TIME_INTERVAL { helper.emit($TIME_INTERVAL,
DroolsEditorType.NULL_CONST); }
diff --git
a/drools-drl/drools-drl-parser/src/main/antlr4/org/drools/drl/parser/antlr4/DRLParser.g4
b/drools-drl/drools-drl-parser/src/main/antlr4/org/drools/drl/parser/antlr4/DRLParser.g4
index 6afee1260e..0d6c42b8d7 100644
---
a/drools-drl/drools-drl-parser/src/main/antlr4/org/drools/drl/parser/antlr4/DRLParser.g4
+++
b/drools-drl/drools-drl-parser/src/main/antlr4/org/drools/drl/parser/antlr4/DRLParser.g4
@@ -2,7 +2,7 @@ parser grammar DRLParser;
options { tokenVocab=DRLLexer; }
-import JavaParser;
+import DRL6Expressions, JavaParser;
/*
* statement := importStatement
@@ -138,26 +138,6 @@ constraints : constraint (COMMA constraint)* ;
constraint : ( nestedConstraint | conditionalOrExpression ) ;
nestedConstraint : ( IDENTIFIER ( DOT | NULL_SAFE_DOT | HASH ) )* IDENTIFIER
(DOT | NULL_SAFE_DOT ) LPAREN constraints RPAREN ;
-// TBD: constraint parsing could be delegated to DRL6ExpressionParser
-conditionalOrExpression : left=conditionalAndExpression (OR
right=conditionalAndExpression)* ;
-conditionalAndExpression : left=inclusiveOrExpression (AND
right=inclusiveOrExpression)* ;
-inclusiveOrExpression : left=exclusiveOrExpression (BITOR
right=exclusiveOrExpression)* ;
-exclusiveOrExpression : left=andExpression (CARET right=andExpression)* ;
-andExpression : left=equalityExpression (BITAND right=equalityExpression)* ;
-equalityExpression : label? left=instanceOfExpression ( ( op=EQUAL |
op=NOTEQUAL ) right=instanceOfExpression )* ;
-instanceOfExpression : left=inExpression ( 'instanceof' right=type )? ;
-inExpression : left=relationalExpression ( 'not'? 'in' LPAREN drlExpression
(COMMA drlExpression)* RPAREN )? ;
-relationalExpression : left=drlExpression (right=orRestriction)* ;
-orRestriction : left=andRestriction (OR right=andRestriction)* ;
-andRestriction : left=singleRestriction (AND right=singleRestriction)* ;
-singleRestriction : op=relationalOperator squareArguments? drlExpression ;
-
-// OOPath
-xpathSeparator : DIV | QUESTION_DIV ;
-xpathPrimary : label? xpathChunk+ ;
-xpathChunk : xpathSeparator drlIdentifier (DOT drlIdentifier)* (HASH
drlIdentifier)? (LBRACK xpathExpressionList RBRACK)? ;
-xpathExpressionList : label? drlExpression (COMMA label? drlExpression)* ;
-
// named consequence
// consequenceInvocation := conditionalBranch | namedConsequence
@@ -188,8 +168,7 @@ relationalOperator
| temporalOperator
;
-// IDENTIFIER is required to accept custom operators.
-drlRelationalOperator : DRL_NOT? (IDENTIFIER | builtInOperator) ;
+drlRelationalOperator : DRL_NOT? builtInOperator ;
/* function := FUNCTION type? ID parameters(typed) chunk_{_} */
functiondef : DRL_FUNCTION typeTypeOrVoid? IDENTIFIER formalParameters
drlBlock ;
@@ -200,93 +179,6 @@ drlQualifiedName
: drlIdentifier (DOT drlIdentifier)*
;
-/* extending JavaParser identifier */
-drlIdentifier
- : drlKeywords
- | IDENTIFIER
- | MODULE
- | OPEN
- | REQUIRES
- | EXPORTS
- | OPENS
- | TO
- | USES
- | PROVIDES
- | WITH
- | TRANSITIVE
- | YIELD
- | SEALED
- | PERMITS
- | RECORD
- | VAR
- | THIS
- ;
-
-drlKeywords
- : builtInOperator
- | DRL_UNIT
- | DRL_FUNCTION
- | DRL_GLOBAL
- | DRL_DECLARE
- | DRL_RULE
- | DRL_QUERY
- | DRL_WHEN
- | DRL_THEN
- | DRL_END
- | DRL_AND
- | DRL_OR
- | DRL_EXISTS
- | DRL_NOT
- | DRL_IN
- | DRL_FROM
- | DRL_ACCUMULATE
- | DRL_ACC
- | DRL_INIT
- | DRL_ACTION
- | DRL_REVERSE
- | DRL_RESULT
- | DRL_ENTRY_POINT
- | DRL_EVAL
- | DRL_SALIENCE
- | DRL_ENABLED
- | DRL_NO_LOOP
- | DRL_AUTO_FOCUS
- | DRL_LOCK_ON_ACTIVE
- | DRL_REFRACT
- | DRL_DIRECT
- | DRL_AGENDA_GROUP
- | DRL_ACTIVATION_GROUP
- | DRL_RULEFLOW_GROUP
- | DRL_DATE_EFFECTIVE
- | DRL_DATE_EXPIRES
- | DRL_DIALECT
- | DRL_CALENDARS
- | DRL_TIMER
- | DRL_DURATION
- ;
-
-builtInOperator
- : DRL_CONTAINS
- | DRL_EXCLUDES
- | DRL_MATCHES
- | DRL_MEMBEROF
- | DRL_SOUNDSLIKE
- | DRL_AFTER
- | DRL_BEFORE
- | DRL_COINCIDES
- | DRL_DURING
- | DRL_FINISHED_BY
- | DRL_FINISHES
- | DRL_INCLUDES
- | DRL_MEETS
- | DRL_MET_BY
- | DRL_OVERLAPPED_BY
- | DRL_OVERLAPS
- | DRL_STARTED_BY
- | DRL_STARTS
- | DRL_STR
- ;
-
/* extending JavaParser expression */
drlExpression
: drlPrimary
@@ -351,16 +243,6 @@ temporalOperator : DRL_NOT? bop=(DRL_AFTER | DRL_BEFORE |
DRL_COINCIDES | DRL_DU
timeAmount : LBRACK (TIME_INTERVAL | DECIMAL_LITERAL | MUL | SUB MUL) (COMMA
(TIME_INTERVAL | DECIMAL_LITERAL | MUL | SUB MUL))* RBRACK ;
-unaryExpressionNotPlusMinus : (left2=xpathPrimary | left1=drlPrimary)
(selector)* ;
-
-selector
- : DOT SUPER superSuffix
- | DOT NEW (nonWildcardTypeArguments)? innerCreator
- | (DOT | NULL_SAFE_DOT) drlIdentifier (drlArguments)?
- | (DOT | NULL_SAFE_DOT) drlMethodCall
- | LBRACK drlExpression RBRACK
- ;
-
/* extending JavaParser primary */
drlPrimary
: LPAREN drlExpression RPAREN
@@ -368,7 +250,7 @@ drlPrimary
| SUPER
| NEW drlCreator
| drlLiteral
- | drlIdentifier drlIdentifierMiddle* identifierSuffix?
+ | drlIdentifier
| typeTypeOrVoid DOT CLASS
| nonWildcardTypeArguments (explicitGenericInvocationSuffix | THIS
arguments)
| inlineListExpression
@@ -376,17 +258,6 @@ drlPrimary
| inlineCast
;
-drlIdentifierMiddle
- : (DOT | NULL_SAFE_DOT | HASH) drlIdentifier
- | (DOT | NULL_SAFE_DOT) LPAREN drlExpression (COMMA drlExpression)* RPAREN
- ;
-
-identifierSuffix
- : (LBRACK RBRACK)+ DOT CLASS
- | (LBRACK drlExpression RBRACK)+
- | arguments
- ;
-
inlineCast : drlIdentifier HASH drlIdentifier ;
/* extending JavaParser literal */
@@ -403,16 +274,10 @@ drlLiteral
| TIME_INTERVAL
;
-squareArguments : LBRACK expressionList? RBRACK ;
-
inlineListExpression
: LBRACK expressionList? RBRACK
;
-expressionList
- : drlExpression (COMMA drlExpression)*
- ;
-
inlineMapExpression
: LBRACK mapExpressionList RBRACK
;
@@ -446,7 +311,7 @@ patternSource : fromAccumulate
| fromExpression
;
-fromExpression : unaryExpressionNotPlusMinus ;
+fromExpression : conditionalOrExpression ;
/*
@@ -559,7 +424,7 @@ drlElementValue
;
attributes : attribute ( COMMA? attribute )* ;
-attribute : name=( 'salience' | 'enabled' ) conditionalOrExpression
#expressionAttribute
+attribute : name=( 'salience' | 'enabled' ) conditionalAttributeValue
#expressionAttribute
| name=( 'no-loop' | 'auto-focus' | 'lock-on-active' | 'refract' |
'direct' ) BOOL_LITERAL? #booleanAttribute
| name=( 'agenda-group' | 'activation-group' | 'ruleflow-group' |
'date-effective' | 'date-expires' | 'dialect' ) DRL_STRING_LITERAL
#stringAttribute
| name='calendars' DRL_STRING_LITERAL ( COMMA DRL_STRING_LITERAL )*
#stringListAttribute
@@ -567,6 +432,8 @@ attribute : name=( 'salience' | 'enabled' )
conditionalOrExpression #expressionA
| name='duration' ( DECIMAL_LITERAL | TIME_INTERVAL | LPAREN
TIME_INTERVAL RPAREN ) #durationAttribute
;
+conditionalAttributeValue : ( LPAREN conditionalExpression RPAREN |
conditionalExpression ) ;
+
chunk : .+?;
assignmentOperator : ASSIGN
diff --git
a/drools-drl/drools-drl-parser/src/main/java/org/drools/drl/parser/antlr4/DRLParserHelper.java
b/drools-drl/drools-drl-parser/src/main/java/org/drools/drl/parser/antlr4/DRLParserHelper.java
index 3d91f782a4..9c8fef57d0 100644
---
a/drools-drl/drools-drl-parser/src/main/java/org/drools/drl/parser/antlr4/DRLParserHelper.java
+++
b/drools-drl/drools-drl-parser/src/main/java/org/drools/drl/parser/antlr4/DRLParserHelper.java
@@ -32,6 +32,7 @@ import org.antlr.v4.runtime.tree.ErrorNode;
import org.antlr.v4.runtime.tree.ParseTree;
import org.antlr.v4.runtime.tree.TerminalNode;
import org.drools.drl.ast.descr.PackageDescr;
+import org.kie.internal.builder.conf.LanguageLevelOption;
/**
* Collection of static helper methods for DRLParser
@@ -76,7 +77,10 @@ public class DRLParserHelper {
private static DRLParser createDrlParser(CharStream charStream) {
DRLLexer drlLexer = new DRLLexer(charStream);
CommonTokenStream commonTokenStream = new CommonTokenStream(drlLexer);
- return new DRLParser(commonTokenStream);
+ DRLParser parser = new DRLParser(commonTokenStream);
+ ParserHelper helper = new ParserHelper(commonTokenStream,
LanguageLevelOption.DRL6);
+ parser.setHelper(helper);
+ return parser;
}
/**
diff --git
a/drools-drl/drools-drl-parser/src/main/java/org/drools/drl/parser/antlr4/DRLVisitorImpl.java
b/drools-drl/drools-drl-parser/src/main/java/org/drools/drl/parser/antlr4/DRLVisitorImpl.java
index ba9157897e..526aaddf24 100644
---
a/drools-drl/drools-drl-parser/src/main/java/org/drools/drl/parser/antlr4/DRLVisitorImpl.java
+++
b/drools-drl/drools-drl-parser/src/main/java/org/drools/drl/parser/antlr4/DRLVisitorImpl.java
@@ -399,7 +399,7 @@ public class DRLVisitorImpl extends
DRLParserBaseVisitor<Object> {
AttributeDescr attributeDescr = BaseDescrFactory.builder(new
AttributeDescr(ctx.name.getText()))
.withParserRuleContext(ctx)
.build();
-
attributeDescr.setValue(getTextPreservingWhitespace(ctx.conditionalOrExpression()));
+
attributeDescr.setValue(getTextPreservingWhitespace(ctx.conditionalAttributeValue()));
attributeDescr.setType(AttributeDescr.Type.EXPRESSION);
return attributeDescr;
}
@@ -673,8 +673,8 @@ public class DRLVisitorImpl extends
DRLParserBaseVisitor<Object> {
.build();
behaviorDescr.setType(ctx.DRL_WINDOW().getText());
behaviorDescr.setSubType(ctx.IDENTIFIER().getText());
- List<DRLParser.DrlExpressionContext> drlExpressionContexts =
ctx.expressionList().drlExpression();
- List<String> parameters =
drlExpressionContexts.stream().map(Antlr4ParserStringUtils::getTextPreservingWhitespace).collect(Collectors.toList());
+ List<DRLParser.ExpressionContext> expressionContexts =
ctx.expressionList().expression();
+ List<String> parameters =
expressionContexts.stream().map(Antlr4ParserStringUtils::getTextPreservingWhitespace).collect(Collectors.toList());
behaviorDescr.setParameters(parameters);
return behaviorDescr;
}
diff --git
a/drools-drl/drools-drl-parser/src/main/java/org/drools/drl/parser/antlr4/Drl6ExprParserAntlr4.java
b/drools-drl/drools-drl-parser/src/main/java/org/drools/drl/parser/antlr4/Drl6ExprParserAntlr4.java
index 4505ca428a..29102a0f7d 100644
---
a/drools-drl/drools-drl-parser/src/main/java/org/drools/drl/parser/antlr4/Drl6ExprParserAntlr4.java
+++
b/drools-drl/drools-drl-parser/src/main/java/org/drools/drl/parser/antlr4/Drl6ExprParserAntlr4.java
@@ -52,7 +52,8 @@ public class Drl6ExprParserAntlr4 implements DrlExprParser {
DRLLexer lexer = new DRLLexer(CharStreams.fromString(text));
CommonTokenStream input = new CommonTokenStream(lexer);
helper = new ParserHelper(input, languageLevel);
- DRLExpressions parser = new DRL6Expressions(input, helper);
+ DRL6Expressions parser = new DRL6Expressions(input);
+ parser.setHelper(helper);
parser.addErrorListener(new BaseErrorListener() {
@Override
public void syntaxError(Recognizer<?, ?> recognizer, Object
offendingSymbol, int line, int charPositionInLine, String msg,
RecognitionException e) {
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]