Tôi đang sử dụng PyParsing để phân tích cú pháp một số tệp văn bản khá lớn có định dạng giống như C (braces and semicolons và tất cả những điều đó).Phân tích gia tăng nhưng đầy đủ với PyParsing?
PyParsing hoạt động rất tốt, nhưng tốc độ chậm và tiêu tốn rất nhiều bộ nhớ do kích thước tệp của tôi.
Vì lý do này, tôi muốn thử triển khai phương pháp phân tích gia tăng phân tích cú pháp trong đó tôi sẽ phân tích cú pháp các phần tử cấp cao nhất của tệp nguồn từng cái một. Phương pháp pyparsing scanString
có vẻ giống như cách rõ ràng để thực hiện điều này. Tuy nhiên, tôi muốn đảm bảo rằng không có văn bản không hợp lệ/không thể phân bổ ở giữa các phần được phân tích cú pháp theo scanString
và không thể tìm ra cách tốt để thực hiện việc này.
Dưới đây là một ví dụ đơn giản đó cho thấy vấn đề tôi đang gặp:
sample="""f1(1,2,3); f2_no_args();
# comment out: foo(4,5,6);
bar(7,8);
this should be an error;
baz(9,10);
"""
from pyparsing import *
COMMENT=Suppress('#' + restOfLine())
SEMI,COMMA,LPAREN,RPAREN = map(Suppress,';,()')
ident = Word(alphas, alphanums+"_")
integer = Word(nums+"+-",nums)
statement = ident("fn") + LPAREN + Group(Optional(delimitedList(integer)))("arguments") + RPAREN + SEMI
p = statement.ignore(COMMENT)
for res, start, end in p.scanString(sample):
print "***** (%d,%d)" % (start, end)
print res.dump()
Output:
***** (0,10)
['f1', ['1', '2', '3']]
- arguments: ['1', '2', '3']
- fn: f1
***** (11,25)
['f2_no_args', []]
- arguments: []
- fn: f2_no_args
***** (53,62)
['bar', ['7', '8']]
- arguments: ['7', '8']
- fn: bar
***** (88,98)
['baz', ['9', '10']]
- arguments: ['9', '10']
- fn: baz
Các dãy được trả về bởi scanString
có những khoảng trống do văn bản chưa phân tích giữa chúng ((0, 10), (11,25), (53,62), (88,98)). Hai trong số những khoảng trống này là khoảng trống hoặc nhận xét, không nên kích hoạt lỗi, nhưng một trong số chúng (this should be an error;
) chứa văn bản không được phân loại mà tôi muốn nắm bắt.
Có cách nào để sử dụng pyparsing để phân tích cú pháp tệp tăng dần trong khi vẫn đảm bảo rằng toàn bộ đầu vào có thể được phân tích cú pháp bằng ngữ pháp phân tích cú pháp được chỉ định không?