Używam PyParsing do parsowania niektórych raczej dużych plików tekstowych w formacie podobnym do C (braces and semicolons i tym podobne).Przyrostowe, ale pełne parsowanie za pomocą PyParsing?
PyParsing działa świetnie, ale jest wolny i zużywa bardzo dużo pamięci ze względu na rozmiar moich plików.
Z tego powodu chciałem spróbować zastosować metodę analizy składniowej , w której pojedynczo analizowałem elementy najwyższego poziomu pliku źródłowego. Metoda pyparowania w stylu scanString
wydaje się być oczywistym sposobem na zrobienie tego. Jednak chcę się upewnić, że nie ma niepoprawnego/nieodwracalnego tekstu pomiędzy sekcjami analizowanymi przez scanString
i nie można znaleźć dobrego sposobu, aby to zrobić.
Oto uproszczony przykład, który pokazuje problem mam:
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()
wyjściowa:
***** (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
Zakresy zwracane przez scanString
mają braki spowodowane nieanalizowanego tekstu między nimi ((0, 10), (11,25), (53,62), (88,98)). Dwie z tych przerw są białymi znakami lub komentarzami, które nie powinny powodować błędu, ale jeden z nich (this should be an error;
) zawiera niepodobny tekst, który chcę przechwycić.
Czy istnieje sposób na użycie pyparsing do parsowania pliku przyrostowo, przy jednoczesnym zapewnieniu, że całe dane wejściowe mogą być analizowane z gramatyki określonego parsera?