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 bbd315fe53 [incubator-kie-drools#5700] [new-parser] Can't use 
single-quoted Strings in RHS (#5726)
bbd315fe53 is described below

commit bbd315fe5380a96137f1b877b1485fc90fef69e0
Author: Toshiya Kobayashi <[email protected]>
AuthorDate: Mon Feb 26 18:14:59 2024 +0900

    [incubator-kie-drools#5700] [new-parser] Can't use single-quoted Strings in 
RHS (#5726)
---
 .../drl/parser/antlr4/MiscDRLParserTest.java       | 45 ++++++++++++++++++----
 .../org/drools/drl/parser/antlr4/DRLLexer.g4       | 20 ++++++++--
 .../org/drools/drl/parser/antlr4/DRLParser.g4      |  2 +-
 .../drools/drl/parser/antlr4/DRLVisitorImpl.java   |  2 +-
 4 files changed, 56 insertions(+), 13 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 c40543c485..f531675782 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
@@ -3449,7 +3449,6 @@ class MiscDRLParserTest {
                 "    $s : String()\n" +
                 "then\n" +
                 "    delete($s);end\n"; // no space after semicolon
-
         PackageDescr packageDescr = parser.parse(text );
 
         RuleDescr ruleDescr = packageDescr.getRules().get(0);
@@ -3464,9 +3463,6 @@ class MiscDRLParserTest {
                 "    $p : Person()\n" +
                 "then\n" +
                 "    modify($p) { setAge(2) }end\n"; // no space after right 
brace
-
-        System.out.println(text);
-
         PackageDescr packageDescr = parser.parse(text );
 
         RuleDescr ruleDescr = packageDescr.getRules().get(0);
@@ -3481,12 +3477,47 @@ class MiscDRLParserTest {
                 "    $p : Person()\n" +
                 "then\n" +
                 "    retract($p)end\n"; // no space after right parenthesis
+        PackageDescr packageDescr = parser.parse(text);
+
+        RuleDescr ruleDescr = packageDescr.getRules().get(0);
+        
assertThat(ruleDescr.getConsequence().toString()).isEqualToIgnoringWhitespace("retract($p)");
+    }
 
-        System.out.println(text);
+    @Test
+    void singleQuoteInRhsWithSpace() {
+        String consequence = getResultConsequence("    System.out.println( 
'singleQuoteInRhs' );\n");
+        assertThat(consequence)
+                .as("Single quote should be converted to double quote")
+                .isEqualToIgnoringWhitespace("System.out.println( 
\"singleQuoteInRhs\" );");
+    }
 
-        PackageDescr packageDescr = parser.parse(text );
+    @Test
+    void singleQuoteInRhsWithoutSpace() {
+        String consequence = getResultConsequence("    
System.out.println('singleQuoteInRhs');\n");
+        assertThat(consequence)
+                .as("Single quote should be converted to double quote")
+                .isEqualToIgnoringWhitespace("System.out.println( 
\"singleQuoteInRhs\" );");
+    }
+
+    @Test
+    void singleQuoteInDoubleQuoteInRhsWithoutSpace() {
+        String consequence = getResultConsequence("    
System.out.println(\"There is '\" + $s + \"' in the workspace.\");\n");
+        assertThat(consequence)
+                .as("Single quote should not be converted to double quote in 
case of inside double quotes")
+                .isEqualToIgnoringWhitespace("System.out.println(\"There is 
'\" + $s + \"' in the workspace.\");");
+    }
+
+    private String getResultConsequence(String rhs) {
+        final String text = "package org.drools\n" +
+                "rule X\n" +
+                "when\n" +
+                "    $s : String()\n" +
+                "then\n" +
+                rhs +
+                "end\n";
+        PackageDescr packageDescr = parser.parse(text);
 
         RuleDescr ruleDescr = packageDescr.getRules().get(0);
-        
assertThat(ruleDescr.getConsequence().toString()).isEqualToIgnoringWhitespace("retract($p)");
+        return ruleDescr.getConsequence().toString();
     }
 }
diff --git 
a/drools-drl/drools-drl-parser/src/main/antlr4/org/drools/drl/parser/antlr4/DRLLexer.g4
 
b/drools-drl/drools-drl-parser/src/main/antlr4/org/drools/drl/parser/antlr4/DRLLexer.g4
index a2ef032823..a54ee07fda 100644
--- 
a/drools-drl/drools-drl-parser/src/main/antlr4/org/drools/drl/parser/antlr4/DRLLexer.g4
+++ 
b/drools-drl/drools-drl-parser/src/main/antlr4/org/drools/drl/parser/antlr4/DRLLexer.g4
@@ -158,9 +158,21 @@ DrlUnicodeEscape
 mode RHS;
 RHS_WS : [ \t\r\n\u000C]+ -> channel(HIDDEN);
 DRL_RHS_END : 'end' [ \t]* SEMI? [ \t]* ('\n' | '\r\n' | EOF) 
{setText("end");} -> popMode;
+
+RHS_STRING_LITERAL
+      // cannot reuse DRL_STRING_LITERAL because Actions are ignored in 
referenced rules
+    : ('"' ( DrlEscapeSequence | ~('\\'|'"') )* '"')
+    | ('\'' ( DrlEscapeSequence | ~('\\'|'\'') )* '\'') { setText( 
normalizeString( getText() ) ); }
+    ;
+
 RHS_CHUNK
-    : ~[ ;})\t\r\n\u000C]+ [;})]? // ; } ) could be a delimitter proceding 
'end'
-    | SEMI
-    | RBRACE
+    : ~[ ()[\]{},;\t\r\n\u000C]+ // ;}) could be a delimitter proceding 'end'. 
()[]{},; are delimiters to match RHS_STRING_LITERAL
+    | LPAREN
     | RPAREN
-    ;
\ No newline at end of file
+    | LBRACK
+    | RBRACK
+    | LBRACE
+    | RBRACE
+    | COMMA
+    | SEMI
+    ;
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 933c013ee6..5ae8c9016b 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
@@ -428,7 +428,7 @@ lhsAccumulate : (DRL_ACCUMULATE|DRL_ACC) LPAREN lhsAndDef 
(COMMA|SEMI)
 
 rhs : DRL_THEN consequence ;
 
-consequence : RHS_CHUNK* ;
+consequence : ( RHS_STRING_LITERAL | RHS_CHUNK )* ;
 
 stringId : ( IDENTIFIER | DRL_STRING_LITERAL ) ;
 
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 a3cae67b9b..e28b6df887 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
@@ -263,7 +263,7 @@ public class DRLVisitorImpl extends 
DRLParserBaseVisitor<Object> {
 
         if (ctx.rhs() != null) {
             ruleDescr.setConsequenceLocation(ctx.rhs().getStart().getLine(), 
ctx.rhs().getStart().getCharPositionInLine()); // location of "then"
-            
ruleDescr.setConsequence(trimThen(getTextPreservingWhitespace(ctx.rhs()))); // 
RHS is just a text
+            
ruleDescr.setConsequence(trimThen(getTokenTextPreservingWhitespace(ctx.rhs(), 
tokenStream))); // RHS is just a text
         }
 
         return ruleDescr;


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to