Modul Parser
Im Modul Parser sind die globalen Variablen inputstring, originalinput, errormessage und errorposition sowie eine minimale Menge von grundlegenden Funktionen zur Abarbeitung des Eingabewortes definiert.
def compile(x, startSymbol):
global inputstring, originalinput, errormessage, errorposition
inputstring=x
originalinput=x
errormessage="ok"
r=None
try:
r=startSymbol()
if not inputEmpty():
raise Exception("Zuviele Zeichen: "+inputstring)
except Exception as e:
errormessage=str(e)
errorposition=len(x)-len(inputstring)
return r
def parse(x, startSymbol):
compile(x, startSymbol)
def comes(x):
global inputstring
return inputstring.startswith(x)
def lookahead(k=1):
global inputstring
return inputstring[:k]
def consume(k=1):
global inputstring
inputstring=inputstring[k:]
def getSymbol(k=1):
x=lookahead(k)
consume(k)
return x
def inputEmpty():
global inputstring
return inputstring==""
def comesAnyOf(x):
return not inputEmpty() and lookahead() in x
def match(x):
if comes(x):
consume(len(x))
else:
raise Exception("Erwartet: "+x)
def showErrorPosition():
global originalinput, errormessage, errorposition
s=originalinput+"\n"
s+=errorposition*"-"
s+="^\n"
s+=errormessage
print s
Die Funktion compile erhält die Funktion startSymbol als Parameter. Diese Funktion ist im Modul Parser nicht implementiert, sie wird in einem eigenen Modul, das den konkreten Recursive-Descent-Parser enthält, implementiert.
Die Grammatik mit den Produktionen
SaSb | ε
erzeugt die Sprache
L = { anbn | n ∈ ℕ0 }.
Ein Parser für diese Sprache L wird wie folgt implementiert. Das Modul AsbParser importiert zunächst das Modul Parser. Dann wird die Funktion s entsprechend der Produktion für die Variable S der Grammatik implementiert.
from Parser import *
def s():
if comes("a"):
match("a")
s()
match("b")
else:
pass
Im Hauptprogramm wird der Parser dann folgendermaßen getestet, hierbei wird der Funktion parse das Eingabewort und der Name der Funktion, die dem Startsymbol der Grammatik entspricht, übergeben.
from AsbParser import *
parse("aabb", s)
showErrorPosition()
Im Fehlerfall, etwa bei Eingabe des Wortes aaba, wird die Fehlerposition mit showErrorPosition ausgegeben:
aaba
---^
Erwartet: b
[up]
H.W. Lang mail@hwlang.de Impressum Datenschutz
Created: 15.08.2012 Updated: 17.02.2023
Diese Webseiten sind während meiner Lehrtätigkeit an der Hochschule Flensburg entstanden