Các Examples page trên wiki pyparsing bao gồm một SimpleBool.py mẫu mà sẽ phân tích và đánh giá các biểu hiện như:
test = ["p and not q",
"not not p",
"not(p and q)",
"q or not p and r",
"q or not (p and r)",
"p or q or r",
"p or q or r and False",
]
(Hmmm, không có bất kỳ ví dụ với dấu ngoặc lồng nhau, nhưng những là . hỗ trợ quá)
Các phân tích cú pháp thực tế được xác định trong toàn bộ sử dụng mã này:
boolOperand = Word(alphas,max=1) | oneOf("True False")
boolExpr = operatorPrecedence(boolOperand,
[
("not", 1, opAssoc.RIGHT, BoolNot),
("and", 2, opAssoc.LEFT, BoolAnd),
("or", 2, opAssoc.LEFT, BoolOr),
])
Phần còn lại của ví dụ cho phép thực hiện BoolNot, BoolOr và BoolAnd. Cấu trúc operatorPrecedence định nghĩa chuỗi các hoạt động, tính chất và tính liên kết của chúng, và tùy chọn một lớp được xây dựng với các phần tử được phân tích cú pháp. operatorPrecedence sau đó sẽ chăm sóc định nghĩa ngữ pháp, bao gồm định nghĩa đệ quy của boolExpr trong ngoặc đơn lồng nhau. Cấu trúc kết quả tương tự như một AST lồng nhau bằng cách sử dụng các lớp BoolXxx đã cho.Những lớp lần lượt xác định eval
phương pháp để các biểu thức có thể phân tích và đánh giá sử dụng mã này:
p = True
q = False
r = True
for t in test:
res = boolExpr.parseString(t)[0]
print t,'\n', res, '=', bool(res),'\n'
pyparsing chính nó là một mô-đun hơi hơi dài, nhưng nó là một tập tin nguồn duy nhất để dấu chân cài đặt của nó là khá nhỏ. Giấy phép MIT cho phép sử dụng thương mại và phi thương mại.
Chính xác thì bạn đang cố gắng làm gì? – Gumbo
Tôi có một triển khai JS phía máy khách tùy chỉnh tạo ra biểu thức số học boolean (trong đó a, b, c ... thực sự là tra cứu trường để sử dụng sau này trong bộ lọc ORM Django), sau đó được POST tới máy chủ và phân tích bằng Python . Tôi hy vọng điều đó đúng. – nikola
Vì vậy, bạn muốn phân tích biểu thức đó để đánh giá nó sau này, phải không? – Gumbo