Skip to content

Need help with grammar definiton. #37

@kiransunkari

Description

@kiransunkari

Hi Jon,
I've been working on defining a grammar for parsing expressions from strings. Currently, my grammar is set up to handle expressions like a == 2, where a is an identifier, == is an operator, and 2 is a value.
I've defined literals for identifiers and values, including strings, numbers, true, and false, along with comparison and logical operators.
My grammar properly handles expressions involving multiple sub-expressions: a == 2 && b == false as well.
Now, I'm looking to extend my grammar to support expressions with array fields, like a[value == 2]. which means under array field a, value == 2.
To handle array expression I extended the grammar like this.

      final Parser<Chr, Either<Value, Expr>> valueOrExpression =  Parser.choice(
         numberValue.map(Either::left),
         stringValue.map(Either::left),
         trueValue.map(Either::left),
         falseValue.map(Either::left),
         expr.map(Either::right)
      );
      // Define a parser for handling both comparison and array match expressions
   final Parser<Chr, Expr> cmpOrArrayExpr =
         identifier.andL(whitespace.optional())
            .and(Parser.choice(arrayOpenOp, comparableOp.map(CmpOp::getCode)))
            .andL(whitespace.optional())
            .and(valueOrExpression)
            .andL(whitespace.optional())
            .and(arrayCloseOp.optional())
            .map((ident, symbolAfterIdentifier, expression, closeOp) -> {
               // If the expression is an array match expression, return an ArrayMatchExpr instance
               // eg: a["type" == 2]
               if (symbolAfterIdentifier.equals("["))
               {
                  return new Array(ident, CmpOp.EQ, expression);
               }
               else
               {
                  return new Cmp(ident, CmpOp.fromCode(symbolAfterIdentifier), expression.left());
               }
            });

For expressions like "a[value > 2 && b == 5]", my grammar rules can convert the string to the expression tree. However, for filter expressions such as "a[type == 2]", it's attempting to convert "type" to a boolean value. I understand that in the valueOrExpression, I defined trueValue before the expression, causing it to try and convert to a boolean and fail.

I'm currently stuck on this issue and would greatly appreciate your help on this.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions