Ich möchte einen String analysieren, der einen booleschen Ausdruck darstellt. Der folgende Code basiert auf vielen Beispielen und verwendet pyparsing's operatorPrecedence Helper.
Das Problem ist, dass ich möchte, dass der Code eine Ausnahme auslöst, wenn der String nicht sinnvoll analysiert werden kann. Im aktuellen Zustand gehen viele ungültige Ausdrücke einfach stillschweigend durch und der falsche Ausdruck wird zurückgegeben.
import pyparsing
_A = pyparsing.Literal('A')
_B = pyparsing.Literal('B')
bool_operand = pyparsing.Or((_A, _B))
precedence_list = [("NOT", 1, pyparsing.opAssoc.RIGHT),
("AND", 2, pyparsing.opAssoc.LEFT),
("OR", 2, pyparsing.opAssoc.LEFT),]
bool_parser = pyparsing.operatorPrecedence(bool_operand, precedence_list)
print bool_parser.parseString('A OR B OR NOT A') # Ein gültiger String
print bool_parser.parseString('A NOT AND B') # Ein ungültiger String
Das gibt aus:
[['A', 'OR', 'B', 'OR', ['NOT', 'A']]]
['A']
Der erste String funktioniert, aber der zweite String löst nicht die gewünschte Ausnahme aus.
Ideen, wie ich das machen kann? Ich bin nicht besonders vertraut mit pyparsing, also könnte ich dort etwas übersehen haben.