![]() |
|||
| HSG |
|
Schreibe die Definition von Grammatik auf. Als Quellen können wikipedia oder auch S.6 von LR(k)-Analyse für Pragmatiker von Dipl.-Inf. Andreas Kunert dienen.
Zeichne zur Grammatik
S → A A → aaA A → b
einen vollständigen Ableitbaum bis zur Tiefe von 4 Ableitungen.
"Start Symbol" = <Logo>
fd = 'fd'
bk = 'bk'
lt = 'lt'
rt = 'rt'
pu = 'pu'
pd = 'pd'
rp = 'rp'
Kauf = '['
Kzu = ']'
zahl = {digit}+
<Logo> ::= <Befehl><Logo>|
<Befehl> ::= fd zahl | bk zahl | lt zahl | rt zahl | pu | pd | rp zahl Kauf <Logo> Kzu
Mustereingabe: rp8[rp8[lt45fd30]lt45] ]
terminale Symbole, Token: f fd b bk l lt r rt u pu d pd w rp a [ z ] n zahl Produktionen: S → BS S → λ B → fn B → bn B → ln B → rn B → u B → d B → wnaSz
Mustereingabe: wnawnalnfnzlnz z
neu: Line numbers and positional information, Ignored characters, Literal characters
import ply.lex as lex
tokens = ['FD','BK','LT','RT','PU','PD','RP','NUMBER']
literals = '[]' # Eckige Klammern sind literale Token
t_FD = r'fd'
t_BK = r'bk'
t_LT = r'lt'
t_RT = r'rt'
t_PU = r'pu'
t_PD = r'pd'
t_RP = r'rp'
def t_newline(t):
r'\n+'
t.lexer.lineno = t.lexer.lineno + len(t.value)
t_ignore = ' \t'
def t_NUMBER(t):
r'\d+'
t.value = int(t.value)
return t
def t_error(t):
print('Unerwartetes Zeichen:',t.value[0])
t.lexer.skip(1)
s = lex.lex()
Tests
>>> s.input('rp8[rp8[lt45fd30]lt45] ]')
>>> s.token()
LexToken(RP,'rp',1,0)
>>> s.token()
LexToken(NUMBER,8,1,2)
>>> s.token()
LexToken([,'[',1,3)
>>> s.token()
LexToken(RP,'rp',1,4)
>>> s.token()
LexToken(NUMBER,8,1,6)
>>> s.token()
LexToken([,'[',1,7)
>>> s.token()
LexToken(LT,'lt',1,8)
>>> s.token()
LexToken(NUMBER,45,1,10)
>>> s.token()
LexToken(FD,'fd',1,12)
>>> s.token()
LexToken(NUMBER,30,1,14)
>>> s.token()
LexToken(],']',1,16)
>>> s.token()
LexToken(LT,'lt',1,17)
>>> s.token()
LexToken(NUMBER,45,1,19)
>>> s.token()
LexToken(],']',1,21)
>>> s.token()
LexToken(],']',1,23)
>>> s.token()
>>> s.input('rp8 \n [rp8\n[lt45fd30]lt45] ]')
>>> s.token()
LexToken(RP,'rp',1,0)
>>> s.token()
LexToken(NUMBER,8,1,2)
>>> s.token()
LexToken([,'[',2,7)
>>> s.token()
LexToken(RP,'rp',2,8)
>>> s.token()
LexToken(NUMBER,8,2,10)
>>> s.token()
LexToken([,'[',3,12)
>>>