@@ -13,9 +13,8 @@ eine Lisp-artige Sprache.
1313# Methodik
1414
1515Sie 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
2019Korrigieren Sie die Codebasis von Blatt 04, falls notwendig. Ergänzen Sie sodann
2120einen 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