Skip to content

Commit a9e80b1

Browse files
committed
Made syntax more tollerant for whitespaces and made the distinction between string and integer literals
1 parent df450b5 commit a9e80b1

File tree

2 files changed

+25
-13
lines changed

2 files changed

+25
-13
lines changed

core/src/main/scala/de/upb/cs/swt/delphi/core/ql/Syntax.scala

+23-11
Original file line numberDiff line numberDiff line change
@@ -36,13 +36,13 @@ class Syntax(val input : ParserInput) extends Parser {
3636
OrOrElseRule | NotRule
3737
}
3838
def OrOrElseRule = rule {
39-
AndOrElseRule ~ zeroOrMore("||" ~ AndOrElseRule ~> OrExpr)
39+
AndOrElseRule ~ zeroOrMore(Whitespace ~ "||" ~ Whitespace ~ AndOrElseRule ~> OrExpr)
4040
}
4141
def AndOrElseRule = rule {
42-
XorOrElseRule ~ zeroOrMore("&&" ~ XorOrElseRule ~> AndExpr)
42+
XorOrElseRule ~ zeroOrMore(Whitespace ~ "&&" ~ Whitespace ~ XorOrElseRule ~> AndExpr)
4343
}
4444
def XorOrElseRule = rule {
45-
Factor ~ zeroOrMore("%%" ~ Factor ~> XorExpr)
45+
Factor ~ zeroOrMore(Whitespace ~ "%%" ~ Whitespace ~ Factor ~> XorExpr)
4646
}
4747

4848
// Handling parentheses.
@@ -57,18 +57,30 @@ class Syntax(val input : ParserInput) extends Parser {
5757
EqualRule | NotEqualRule | GreaterThanRule | GreaterOrEqual |
5858
LessThan | LessOrEqual | Like | IsTrue
5959
}
60-
def EqualRule = rule { FieldReferenceRule ~ "=" ~ Literal ~> EqualExpr }
61-
def NotEqualRule = rule { FieldReferenceRule ~ "!=" ~ Literal ~> NotEqualExpr }
62-
def GreaterThanRule = rule { FieldReferenceRule ~ ">" ~ Literal ~> GreaterThanExpr }
63-
def GreaterOrEqual = rule { FieldReferenceRule ~ ">=" ~ Literal ~> GreaterOrEqualExpr }
64-
def LessThan = rule { FieldReferenceRule ~ "<" ~ Literal ~> LessThanExpr }
65-
def LessOrEqual = rule { FieldReferenceRule ~ "<=" ~ Literal ~> LessOrEqualExpr }
66-
def Like = rule { FieldReferenceRule ~ "%" ~ Literal ~> LikeExpr }
60+
def EqualRule = rule { FieldReferenceRule ~ Whitespace ~ "=" ~ Whitespace ~ Literal ~> EqualExpr }
61+
def NotEqualRule = rule { FieldReferenceRule ~ Whitespace ~ "!=" ~ Whitespace ~ Literal ~> NotEqualExpr }
62+
def GreaterThanRule = rule { FieldReferenceRule ~ Whitespace ~ ">" ~ Whitespace ~ IntegerLiteral ~> GreaterThanExpr }
63+
def GreaterOrEqual = rule { FieldReferenceRule ~ Whitespace ~ ">=" ~ Whitespace ~ IntegerLiteral ~> GreaterOrEqualExpr }
64+
def LessThan = rule { FieldReferenceRule ~ Whitespace ~ "<" ~ Whitespace ~ IntegerLiteral ~> LessThanExpr }
65+
def LessOrEqual = rule { FieldReferenceRule ~ Whitespace ~ "<=" ~ Whitespace ~ IntegerLiteral ~> LessOrEqualExpr }
66+
def Like = rule { FieldReferenceRule ~ Whitespace ~ "%" ~ Whitespace ~ StringLiteral ~> LikeExpr }
6767
def IsTrue = rule { FieldReferenceRule ~> IsTrueExpr }
6868

6969
// Literals
7070
def FieldReferenceRule = rule { "[" ~ capture(oneOrMore(CharPredicate.AlphaNum ++ '-' ++ ' ' ++ '_' ++ '(' ++ ':' ++')')) ~ "]" ~> FieldReference }
71-
def Literal = rule { capture(oneOrMore(CharPredicate.AlphaNum)) ~> (_.toString) }
71+
72+
def IntegerLiteral = rule { capture(oneOrMore(CharPredicate.Digit)) }
73+
def StringLiteral = rule { '"' ~ capture(oneOrMore(CharPredicate.AlphaNum)) ~ '"'}
74+
75+
def Literal = rule { (IntegerLiteral | StringLiteral ) ~> (_.toString) }
76+
77+
def Whitespace = rule {
78+
zeroOrMore(anyOf(" \n \r"))
79+
}
80+
81+
def OneOrMoreWhitespace = rule {
82+
oneOrMore(anyOf(" \n \r"))
83+
}
7284
}
7385

7486

core/src/test/scala/de/upb/cs/swt/delphi/core/SyntaxTest.scala

+2-2
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ import scala.util.{Failure, Success}
2929
class SyntaxTest extends FlatSpec with Matchers {
3030

3131
"Syntax.singularConditionWithOperator" should "be valid" in {
32-
val parseResult = new Syntax("[Filter1]=abc").QueryRule.run()
32+
val parseResult = new Syntax("[Filter1]=\"abc\"").QueryRule.run()
3333
parseResult shouldBe a [Success[_]]
3434
parseResult match {
3535
case Success(ast) => {
@@ -165,7 +165,7 @@ class SyntaxTest extends FlatSpec with Matchers {
165165
}
166166

167167
"Syntax.notConditionComplex" should "be valid" in {
168-
val parseResult = new Syntax("!!([Filter1])&&!([Filter2]<=0||!([Filter3]&&![Filter4]%abc))").QueryRule.run()
168+
val parseResult = new Syntax("!!([Filter1])&&!([Filter2]<=0||!([Filter3]&&![Filter4]%\"abc\"))").QueryRule.run()
169169
parseResult shouldBe a [Success[_]]
170170
parseResult match {
171171
case Success(ast) => {

0 commit comments

Comments
 (0)