Movatterモバイル変換


[0]ホーム

URL:


Zum Inhalt springen
WikipediaDie freie Enzyklopädie
Suche

LL-Parser

aus Wikipedia, der freien Enzyklopädie

ImCompilerbau ist einLL-Parser ein Top-Down-Parser, der die Eingabe vonLinks nach rechts abarbeitet, um eineLinksableitung der Eingabe zu berechnen.[1]

Ein LL-Parser heißtLL(k)-Parser, wenn er während des ParsenskTokens vorausschauen kann und im Gegensatz zumLF-Parser den Kellerinhalt benutzt.k wird dabei alsLookahead bezeichnet. Diesem Parsertyp liegen dieLL(k)-Grammatiken zu Grunde.

Obwohl die LL(k)-Grammatiken relativ eingeschränkt sind, werden LL(k)-Parser oft benutzt. Die Entscheidung, nach welcher Regel expandiert wird, kann allein durch Analyse des Lookahead getroffen werden. Eine einfache Möglichkeit zur Implementierung dieser Parsertechnik bietet die Methode desrekursiven Abstiegs.

Funktionsweise

[Bearbeiten |Quelltext bearbeiten]

Ausgangspunkt ist eine GrammatikG=(N,Σ,P,S){\displaystyle G=(N,\Sigma ,P,S)}.Der Parser arbeitet mit einer ZustandsmengeQ=(NΣ)×Σ×N{\displaystyle Q=(N\cup \Sigma )^{*}\times \Sigma ^{*}\times \mathbb {N} ^{*}}, wobei sich ein Zustandq=(k,w,z)Q{\displaystyle q=(k,w,z)\in Q} so zusammensetzt:

DernichtdeterministischeAutomat für die LL(k)-Analyse ist dann:

Dabei istS{\displaystyle S} das Startsymbol der zugrundeliegenden Grammatik undz{\displaystyle z} die Linksanalyse der Eingabew{\displaystyle w}.

Die Transitionenδ{\displaystyle \delta } setzen sich so zusammen:

LL(1)-Parser

[Bearbeiten |Quelltext bearbeiten]

Dieser Parsertyp verwendet einen Lookahead von einem Zeichen.Auf Grund dieser Einschränkung kann einfach ein deterministischer Parser erstellt werden.

Die oben genannten nichtdeterministischen Schritte werden dabei durch den Lookahead determiniert.

Beispiel Implementierung in Python

[Bearbeiten |Quelltext bearbeiten]

In einem Beispiel soll ein LL(1) Parser die folgende einfache Grammatik abbilden:

   S → F   S → ( S + F )   F → n

Die folgende Python-Implementierung des LL(1)-Parsers zu dieser Grammatik wird auf den Eingabestring((n+n)+n) angewendet:

# Parse tabletable={'@S':{'n':0,'(':1},'@F':{'n':2}}rules=[['@F'],['(','@S','+','@F',')'],['n']]defsyntactic_analysis(string):print('Syntactic analysis of input string:',string)stack=['\n','@S']tokens=list(string)+['\n']position=0whilelen(stack)>0:stackvalue=stack.pop()token=tokens[position]ifnotstackvalue.startswith('@'):ifstackvalue==token:# print('pop', repr(stackvalue))position+=1iftoken=='\n':print('input accepted')breakelse:print('syntax error at input:',repr(token))breakelse:rule=table[stackvalue].get(token,-1)print('at pos',position,'found rule',repr(stackvalue+' -> '+' '.join(rules[rule])))forrinreversed(rules[rule]):stack.append(r)# print('stack:', repr(', '.join(reversed(stack))))syntactic_analysis('((n+n)+n)')

Die Ausgabe des Skripts ergibt bei korrekter Syntax direkt den serialisierten Syntax-Baum:

Syntactic analysis of input string: ((n+n)+n)at pos 0 found rule '@S -> ( @S + @F )'at pos 1 found rule '@S -> ( @S + @F )'at pos 2 found rule '@S -> @F'at pos 2 found rule '@F -> n'at pos 4 found rule '@F -> n'at pos 7 found rule '@F -> n'input accepted

Siehe auch

[Bearbeiten |Quelltext bearbeiten]

Einzelnachweise

[Bearbeiten |Quelltext bearbeiten]
  1. Alfred V. Aho, Ravi Sethi, Jeffrey D. Ullman:Compilers, Principles, Techniques, and Tools.ISBN 0-201-10088-6, S. 191
Abgerufen von „https://de.wikipedia.org/w/index.php?title=LL-Parser&oldid=210632570
Kategorie:

[8]ページ先頭

©2009-2026 Movatter.jp