Python is een leuke scripttaal. Het geeft ook toegang tot zijn eigen parser en compiler. Het geeft je ook toegang tot verschillende andere parsers voor speciale doeleinden, zoals XML en string templates.
Maar soms wilt u misschien uw eigen parser hebben. Dit is wat pyPEG voor.
Om een snel overzicht van wat er gebeurt te krijgen, lees dan dit artikel over hoe je een willekeurige taal naar XML met pyPEG op mijn blog te ontleden.
Wat is PEG?
PEG betekent parseren Expression Grammatica. Het is zoiets als het idee van reguliere expressies voor context vrije talen; een zeer duidelijke uitleg die u in het Wikipedia artikel over PEG vindt.
Met PEG's kunt u dezelfde taal te beschrijven als bij BNF (en ze zijn zelfs vergelijkbaar).
Wat is een parser-Tolk?
Gemeenschappelijke parsers niet gebruikt PEG's en top-down parsing, maar LR (n) of LL (n) en bottom-up parsing. Dit resulteert in de idee om parser generatoren.
Want met LR (n) of LL (n) parsers je nodig hebt bij het berekenen van een DFA eerste, meestal je laat de parser generator dit voor u doen. Het resultaat is een parser implementatie voor BNF grammatica, waarin de grondstof was. Men kon een parser generator noemen een compiler van BNF een parser implementatie.
Een parser-Tolk werkt als tolk in plaats van zulk een compiler. Geef gewoon je grammatica als input, en het ontleedt de beschreven taal uit de tekst. Er zal geen programma gegenereerd zijn.
Met behulp van pyPEG
Dat wil zeggen: met behulp van pyPEG is zeer eenvoudig;-) Als je weet dat reguliere expressies al, zal je leren om pyPEG snel te gebruiken.
Een kleine steekproef
Een voorbeeld: denk aan een eenvoudige taal zoals deze:
functie Fak (n) {
& Nbsp; if (n == 0) {// 0! 1 is per definitie
& Nbsp; return 1;
& Nbsp;} else {
& Nbsp; return n * fak (n - 1);
& Nbsp;};
}
Een pyPEG voor die taal lijkt op de volgende code (zie ook het voorbeeld script):
def reactie (): return [re.compile (r "//.*"), re.compile ("/*.*?*/", re.S)]
def letterlijke (): return re.compile (".? *" r'd * .d * | | d + ')
def symbool (): return re.compile (r "w +")
def operator (): return re.compile (r "+ | - | * | / | ==")
def bediening (): terugkeer symbool, exploitant, [letterlijke, FunctionCall]
def expressie (): return [letterlijke, bediening, FunctionCall]
def expressionlist (): terugkeren uitdrukking, -1, (",", expressie)
def returnstatement (): return trefwoord ("return"), expressie
def ifstatement (): return trefwoord ("if"), "(", uitdrukking, ")", blok, trefwoord ("anders"), blok
def statement (): return [ifstatement, returnstatement], ";"
def blok (): return "{", -2, verklaring, "}"
def parameterlist (): return "(", symbool, -1, (",", symbool), ")"
def FunctionCall (): return symbool "(" expressionlist, ")"
def function (): return trefwoord ("functie"), symbool, parameterlist, blok
def simpleLanguage (): return functie
Wat is nieuw in deze release:
- Dit is een cleanup release. De code van de parse () en componeren () werd vastgesteld.
Wat is nieuw in versie 1.4:.
- Deze versie lost een aantal bugs met packrat parsing
Wat is nieuw in versie 1.3:
- Het vervangen van de tupel voor namen in Pyast door het symbool (lijst ) klasse, die is vrij compatibel, maar ondersteunt meer beschrijvende code in compiler backends, ook.
Wat is nieuw in versie 1.2:.
- Bugs met Unicode in foutafhandeling werden vastgesteld
Wat is nieuw in versie 1.1:.
- Unicode-ondersteuning is toegevoegd
Wat is nieuw in versie 0.46:.
- pyPEG.print_trace op True
- Het omzetten pyPEG Python 3.x nu werkt naadloos met behulp van 2to3
- De grammatica regels die worden toegepast kan optioneel worden opgespoord door het instellen
- pyPEG zal de uitgang van dit spoor naar stderr.
Wat is nieuw in versie 0.45:.
- Bugfixes
Wat is nieuw in versie 0.44:
- pyPEG siert nu elk Pyast object met de naam van het bronbestand en de lijn nummer.
Eisen
- Python
Reacties niet gevonden