Tôi đang viết một trình phân tích cú pháp cho một ngôn ngữ truy vấn bằng cách sử dụng PyParsing, và tôi đã bị mắc kẹt trên (những gì tôi tin là) một vấn đề với lookaheads. Một loại mệnh đề trong truy vấn được dùng để chia chuỗi thành 3 phần (tên trường, toán tử, giá trị) sao cho trường đó là một từ, toán tử là một hoặc nhiều từ và giá trị là một từ, chuỗi trích dẫn hoặc danh sách được ngoặc đơn những cái nàyPyParsing lookaheads và biểu thức tham lam
Dữ liệu của tôi trông giống như
author is william
author is 'william shakespeare'
author is not shakespeare
author is in (william,'the bard',shakespeare)
Và phân tích cú pháp hiện tại của tôi cho điều khoản này được viết như sau:
fieldname = Word(alphas)
operator = OneOrMore(Word(alphas))
single_value = Word(alphas)^QuotedString(quoteChar="'")
list_value = Literal("(") + Group(delimitedList(single_value)) + Literal(")")
value = single_value^list_value
clause = fieldname + originalTextFor(operator) + value
Rõ ràng điều này không thành do thực tế là các yếu tố operator
là tham lam và sẽ gobble lên value
nếu có thể. Từ việc đọc các câu hỏi và tài liệu tương tự khác, tôi đã tập hợp rằng tôi cần quản lý lookahead đó với NotAny
hoặc FollowedBy
, nhưng tôi đã không thể tìm ra cách để thực hiện công việc đó.
Không thể bạn chỉ cần thực hiện một danh sách rõ ràng của khả năng các nhà khai thác? –
@KarlKnechtel Thật không may, danh sách các nhà khai thác sẽ được mở rộng. Tôi đoán, tôi có thể biên dịch danh sách đó vào thời gian chạy và xây dựng ngữ pháp một cách năng động, nhưng có vẻ như nó sẽ sạch hơn để có thể làm cho trình phân tích cú pháp trở nên bất khả tri. Đó là một kế hoạch sao lưu tốt, mặc dù, trong trường hợp tôi không thể làm việc nó ra, vì vậy cảm ơn. –