Aalborg den 25.02.2003

Introduktion til parsning og top-down parsere vejledende løsninger

Apple 3.1

a)

<stmt> ::= <x-ing> |
<y-ing> |
epsilon
<x-ing> ::= x<some ys>x
<y-ing> ::= y<some xs>y
<some ys> ::= <some ys>y |
epsilon
<some xs> ::= <some xs>x |
epsilon

b)

<stmt> ::= <plus-before-dot> |
<plus-after-do>
<plus-before-dot> ::= <one-or-more><dot><zero-or-more>
<plus-after-dot> ::= <zero-or-more><dot><one-or-more>
<one-or-more> ::= <one-or-more><digit> |
<digit>
<zero-or-more> ::= <one-or-more> |
epsilon
<digit> ::= 0 | 1
<dot> ::= .

Appel 3.4

S produktionerne:

S ::= S; S |
id := E | 
print (L)

For at eliminere venstre rekursion (left recursion) bruges omskrivning fra side 52 i bogen. S produktionerne opskrives som følgende, hvor S' er den nye non-terminal som indføres og <epsilon> er den tomme streng.

S ::= id := E S'    |
print (L) S'
S' ::= ;S S'|
 <epsilon>

Tilsvarende skal der elimineres venstre rekursion i E produktionerne

E ::= id |
num |
E + E |
(S, E)

omskrives som følger.

E ::= id E'|
num E' |
(S, E) E'
E' ::= +E E'| 
 <epsilon>

L produktionerne

L ::= E
L, E
omskrives som følger. Bemærk her kan de omskrevne E produktioner anvendes i stedet, men vi holder os til omskrivning fra side 52.
L ::= E L'
L' ::= ,E L' |
<epsilon>

Det kan være nødvendigt at venstre fakturere (left factoring) en grammatik hvis den samme non-terminal har to produktioner, der starter med de samme symboler, se eksemplerne på slidene 25 og 26 fra gangen om "Syntax Analysis". I den omskrevne grammatik er der ikke brug for left factoring.

Appel 3.5

Det antages at \, { og } er terminaler. Når disse er terminaler er begin, end, og WORD ligeledes terminaler. Herudover anvender Appel her i dette eksempel at End-Of-File (EOF) skrives med ind i grammatikken som en terminal $. Bemærk at Appel's brug af om en non-terminal N er nullable svarer til at sige epsilon tilhører FIRST(N).

Nullable FIRST FOLLOW
S' no \, end, begin, WORD, {, $
S yes \, end, begin, WORD, { \, $, }
X no \, end, begin, WORD, { \, end, begin, WORD, {
B no \ \, end, begin, WORD, {, $
E no \ \, end, begin, WORD, {

Sethi 2.4

a)

<string> ::= <string> <terminal>| <terminal>
<terminal> ::= blank | tab | newline

b)

<sequence> ::= <letter><tail>
<tail> ::= <tail> <letter> |
<tail> <digit> |
epsilon
<letter> ::= a - z
<digit> ::= 0 - 9

c)

<real> ::= <digit-star> <dot> <digit-plus> |
<digit-plus> <dot> <digit-star> |
<digit-plus> <dot> <digit-plus> 
<digit-plus> ::= <digit-plus> <digit> |
<digit>
<digit-star> ::= <digit-plus> |
epsilon
<digit> ::= 0 - 9
<dot> ::= .

Sethi 2.9

a) Listen indeholder en eller mange <name>s med komma mellem <name>s.

b) Listen indeholder en eller mange <field>s med semikolon efter hvert <field>

c) Listen indeholder nul eller mange <statement>s med semikolon mellem <statement>s

d) Listen indeholder en eller mange <factor>s med multiplikations tegnet mellem <factor>s

e) Listen indeholder nul eller en <variables>, som starter med var, hvis den er defineret. der er et kolon mellem <name list> og <type>. Herudover er <type> altid efterfulgt af et semicolon.

f) Listen indeholder nul eller flere <const-decls>s der hver starter med const og efter <name> og <constant> altid har et semicolon. 

Venlig hilsen
Kristian Torp
torp (at) cs (dot) auc (dot) dk