Skip to content

Commit 04c7c82

Browse files
committed
homework: embed lisp grammars (B06)
see #403
1 parent 4b8e3fc commit 04c7c82

1 file changed

Lines changed: 84 additions & 9 deletions

File tree

homework/sheet06.md

Lines changed: 84 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,8 @@ eine Lisp-artige Sprache.
1313
# Methodik
1414

1515
Sie haben in [Blatt 04](sheet04.md) eine Grammatik für die Lisp-artige Sprache
16-
definiert und darauf aufbauend einen Lexer und Parser implementiert, d.h. Sie
17-
können für eine Eingabe eines Programms mit S-Expressions den entsprechenden AST
18-
erzeugen.
16+
definiert und darauf aufbauend einen Lexer und Parser implementiert, d.h. Sie können
17+
für eine Eingabe eines Programms mit S-Expressions den entsprechenden AST erzeugen.
1918

2019
Korrigieren Sie die Codebasis von Blatt 04, falls notwendig. Ergänzen Sie sodann
2120
einen Tree-Walking-Interpreter und eine REPL für die Lisp-artige Sprache.
@@ -72,10 +71,86 @@ Symboltabelle umgehen?
7271

7372
## A6.4: Auswirkungen der Grammatik auf den Interpreter (2P)
7473

75-
Vergleichen Sie ihre eigene Grammatik mit den beiden Grammatiken
76-
([MiniLispA](https://github.com/Compiler-CampusMinden/student-support-code-template/blob/master/src/main/antlr/MiniLispA.g4),
77-
[MiniLispB](https://github.com/Compiler-CampusMinden/student-support-code-template/blob/master/src/main/antlr/MiniLispB.g4)).
74+
Vergleichen Sie ihre eigene Grammatik mit den folgenden beiden Grammatiken:
7875

79-
Welche Auswirkungen hat die Grammatik auf den Interpreter? Machen Sie ein
80-
Gedankenexperiment: Überlegen Sie, was Sie alles in Ihrer Implementierung ändern
81-
müssten, wenn Sie die jeweils andere Grammatik-Variante nutzen würden.
76+
::: {.details title="Grammatik A"}
77+
``` antlr
78+
grammar MiniLispA;
79+
80+
81+
// Parser
82+
program : expr+ EOF ;
83+
84+
expr : NUMBER
85+
| STRING
86+
| TRUE
87+
| FALSE
88+
| ID
89+
| '(' (ID | OP)* expr* ')'
90+
;
91+
92+
93+
// Lexer
94+
TRUE : 'true' ;
95+
FALSE : 'false' ;
96+
ID : [a-z][a-zA-Z0-9]* ;
97+
NUMBER : [0-9]+ ;
98+
OP : '+' | '-' | '*' | '/' | '=' | '>' | '<' ;
99+
STRING : '"' (~[\n\r"])* '"' ;
100+
101+
COMMENT : ';;' ~[\n\r]* -> skip ;
102+
WS : [ ,\t\n\r]+ -> skip ;
103+
```
104+
:::
105+
106+
::: {.details title="Grammatik B"}
107+
``` antlr
108+
grammar MiniLispB;
109+
110+
111+
// Parser
112+
program : expr+ EOF ;
113+
114+
expr : literal
115+
| symbol
116+
| list
117+
| def
118+
| fn
119+
| fcall
120+
| let
121+
;
122+
123+
literal : NUMBER
124+
| STRING
125+
| TRUE
126+
| FALSE
127+
;
128+
129+
symbol : ID ;
130+
131+
list : '(' 'list' expr* ')' ;
132+
def : '(' 'def' symbol expr ')' ;
133+
134+
fn : '(' 'defn' symbol '(' symbol* ')' expr* ')' ;
135+
fcall : '(' (ID | OP) expr* ')' ;
136+
137+
let : '(' 'let' '(' binding* ')' expr ')' ;
138+
binding : symbol expr ;
139+
140+
141+
// Lexer
142+
TRUE : 'true' ;
143+
FALSE : 'false' ;
144+
ID : [a-z][a-zA-Z0-9]* ;
145+
NUMBER : [0-9]+ ;
146+
OP : '+' | '-' | '*' | '/' | '=' | '>' | '<' ;
147+
STRING : '"' (~[\n\r"])* '"' ;
148+
149+
COMMENT : ';;' ~[\n\r]* -> skip ;
150+
WS : [ ,\t\n\r]+ -> skip ;
151+
```
152+
:::
153+
154+
Welche Auswirkungen hat die Grammatik auf den Interpreter? Machen Sie ein kleines
155+
**Gedankenexperiment**: Überlegen Sie, was Sie alles in Ihrer Implementierung ändern
156+
müssten, wenn Sie die jeweils andere Grammatik-Variante (A bzw. B) nutzen würden.

0 commit comments

Comments
 (0)