I'm using PLY and have written below expressions to match this kind of sample string '(A OR B OR C)'.
expression : LPAREN KEYWORD AND KEYWORD RPAREN | LPAREN KEYWORD OR KEYWORD RPAREN | LPAREN KEYWORD AND KEYWORD AND KEYWORD RPAREN | LPAREN KEYWORD OR KEYWORD OR KEYWORD RPAREN | LPAREN KEYWORD AND KEYWORD AND KEYWORD AND KEYWORD RPAREN | LPAREN KEYWORD OR KEYWORD OR KEYWORD OR KEYWORD RPAREN | LPAREN KEYWORD AND KEYWORD AND KEYWORD AND KEYWORD AND KEYWORD RPAREN | LPAREN KEYWORD OR KEYWORD OR KEYWORD OR KEYWORD OR KEYWORD RPAREN | LPAREN KEYWORD AND KEYWORD AND KEYWORD AND KEYWORD AND KEYWORD AND KEYWORD RPAREN | LPAREN KEYWORD OR KEYWORD OR KEYWORD OR KEYWORD OR KEYWORD OR KEYWORD RPAREN
I have no idea how to cover all cases so I have to list them as many as possible and I know that's not elegant.
Any ideas to optimize this expression? Thanks a lot.
Assuming you're using PLY in Python, you can parser this expression with this:
def p_condition(p):
""" condition : LPAREN comparation RPAREN """
def p_comparation(p):
""" comparation : KEYWORD operator KEYWORD
| comparation operator KEYWORD """
def p_operator(p):
"""operator : AND
| OR """
To understand it, read about BNF grammar, and the PLY docs