sprache 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (3) hide show
  1. data/bin/sprache +486 -0
  2. data/sprache.rb +359 -0
  3. metadata +48 -0
data/bin/sprache ADDED
@@ -0,0 +1,486 @@
1
+ #!/usr/bin/ruby
2
+ puts '
3
+
4
+
5
+ Verwendung:
6
+ Sprache started im interaktiven Modus wenn kein Argument gegeben ist.
7
+ Ist eine Datei als Argument gegeben wird diese interpretiert bevor der
8
+ interaktive Modus gestartet wird.
9
+
10
+
11
+ sprache tutorial
12
+ ----------------
13
+
14
+ Konventionen:
15
+ Es koennen Substantive, Adjektive und Verben verwendet werden
16
+ um Logik zu beschreiben.
17
+ Diese werden ab jetzt mit S, A und V abgekuerzt.
18
+
19
+ Zuweisungen:
20
+ Adjektive und Verben koennen mit "ist", "hat" und "kann"
21
+ Substantiven zugewiesen werden. Die worte "der", "die", "das",
22
+ "ein", "eine" und "einen" koennen fuer Lesbarkeit verwentet werden,
23
+ werden jedoch vom Interpreter ignoriert.
24
+
25
+ > S ist A
26
+ > S kann V
27
+ > S hat S
28
+ > der S hat S
29
+ > S hat ein S
30
+ usw
31
+
32
+ zum Beispiel:
33
+
34
+ > Sprache ist toll
35
+ > der Schueler kann schreiben
36
+ > das Handy hat ein Tastenfeld
37
+
38
+ Zum Entfernen von Zuweisungen koennen die woerter "nicht", "kein",
39
+ "keine", "keinen" verwendet werden:
40
+
41
+ > S ist nicht A
42
+ > S kann nicht V
43
+ > S kann keinen V
44
+ > S hat kein S
45
+ usw
46
+
47
+ Fragen:
48
+ Zuweisungen koennen abgefragt werden durch.
49
+ > ist S A
50
+ > kann S V
51
+ > hat S S
52
+
53
+ Fragezeichen koennen zur Lesbarkeit angefuegt werden:
54
+ > ist S A?
55
+
56
+ Die antwort ist ja oder nein.
57
+
58
+ zum Beispiel:
59
+
60
+ > ist Sprache toll
61
+ ja
62
+ > kann Schwein fliegen?
63
+ nein
64
+
65
+ Definitionen:
66
+ Definitionen sind gruppen von Zeilen die mit einem Verb assoziert sind
67
+ (siehe Aktionen).
68
+ In Definitionen kann "*", "er" uns "sie" mit dem ausfuehrenden
69
+ Substantiv ersetzt und "es" mit dem Verb selbst
70
+ (siehe Aktionen).
71
+ Definitionen werden mit "vom" eingeleitet und enden mit einer Leerzeile
72
+ (auch in einer Datei). Im interaktiven Modus wechselt bei Definitionen
73
+ die Prompt von ">" nach " -"
74
+
75
+ > vom V
76
+ - ZEILE1
77
+ - ZEILE2
78
+ ...
79
+ - ZEILEN
80
+ -
81
+ >
82
+
83
+ zum Beispiel:
84
+
85
+ > vom schlafen
86
+ - sub ist ausgeruht
87
+ - bett ist zerknittert
88
+ -
89
+ >
90
+
91
+
92
+ Aktionen:
93
+ Durch Aktionen koennen Definitionen ausgefuehrt werden:
94
+
95
+ > S tut V
96
+
97
+ zum Beispiel:
98
+
99
+ > Die Sonne tut scheinen
100
+
101
+ Dies bewirkt auch, dass S V kann.
102
+
103
+ Bedingungen:
104
+ Mit "wenn" koennen Bedingungen angefuegt werden.
105
+
106
+ > S ist A wenn S2 A2 ist
107
+ > S ist A wenn S2 V kann
108
+
109
+ Bedingungen koennen mit "und" oder "oder" erweitert werden.
110
+ Kommas koennen fuer lesbarkeit verwendet werden.
111
+
112
+ > S ist A wenn S2 A2, A3 und A4 ist
113
+ > S ist A wenn S2 V, V2, oder V3 kann
114
+
115
+ Durch "nicht", "kein", "keine" und "keinen" koennen bedingungen
116
+ negiert werden.
117
+
118
+ Globale Bedingungen:
119
+ Sind alle Bedingungen, die nicht in Definitionen vorkommen.
120
+ Sie werden gespeichert und pro zeile ausgewertet.
121
+ Wenn eine globale Bedingung nicht erfuellt wird, hat
122
+ die Zeile den umgekehrten effekt.
123
+ "er", "sie", "es" und "*" werden durch das Subjektiv am
124
+ Anfang der Zeile ersetzt
125
+
126
+ Lokale Bedingungen:
127
+ Sind bedingungen in definitionen.
128
+ Sie werden nur beim ausfuehren der Aktion ausgewertet.
129
+ Wenn eine lokale Bedingung nicht erfuellt ist, wird die
130
+ Zeile ignoriert.
131
+ "er", "sie" und "*" werden durch das Subjektiv am
132
+ Anfang der Zeile ersetzt. "es" wird durch den Namen der Aktion
133
+ ersetzt.
134
+
135
+
136
+ Beschreiben:
137
+ Wenn nur der Name eines Substantives oder Verbes eingebeben wird, wird
138
+ es beschrieben.
139
+ '
140
+
141
+ $zeilen = ARGF.readlines if ARGV[0]
142
+ $zeilen = [] unless $zeilen
143
+ $zeile = -1
144
+
145
+ def naechste_zeile prompt = "> "
146
+ $zeile += 1
147
+ zeile = $zeilen[$zeile] if $zeilen[$zeile]
148
+ unless zeile
149
+ printf prompt
150
+ zeile = STDIN.gets
151
+ end
152
+ unless zeile
153
+ puts
154
+ exit
155
+ end
156
+ zeile.gsub! /\beinen\b/, ""
157
+ zeile.gsub! /\beine\b/, ""
158
+ zeile.gsub! /\bein\b/, ""
159
+ zeile.gsub! /\der\b/, ""
160
+ zeile.gsub! /\die\b/, ""
161
+ zeile.gsub! /\das\b/, ""
162
+ zeile.gsub! ",", ""
163
+ zeile.gsub! "?", ""
164
+ return zeile
165
+ end
166
+
167
+ class Substantiv
168
+ attr_accessor :bezeichner, :adjektive, :verben, :besitz
169
+
170
+ def initialize bezeichner
171
+ @bezeichner = bezeichner
172
+ @adjektive = []
173
+ @verben = []
174
+ @besitz = []
175
+ end
176
+
177
+ def ist? adjektiv = nil
178
+ return true unless adjektiv
179
+ !!@adjektive.index(adjektiv)
180
+ end
181
+
182
+ def ist! adjektiv
183
+ @adjektive << adjektiv unless self.ist?(adjektiv)
184
+ end
185
+
186
+ def ist_nicht! adjektiv
187
+ @adjektive.delete adjektiv
188
+ end
189
+
190
+ def kann? verb = nil
191
+ return true unless verb
192
+ !!@verben.index(verb)
193
+ end
194
+
195
+ def kann! verb
196
+ @verben << verb unless self.kann?(verb)
197
+ end
198
+
199
+ def kann_nicht! verb
200
+ @verben.delete verb
201
+ end
202
+
203
+ def hat? besitz = nil
204
+ return true unless besitz
205
+ !!@besitz.index(besitz)
206
+ end
207
+
208
+ def hat! besitz
209
+ @besitz << besitz unless self.hat?(besitz)
210
+ end
211
+
212
+ def hat_nicht! besitz
213
+ @besitz.delete besitz
214
+ end
215
+ end
216
+
217
+ class Sprache
218
+ attr_accessor :substantive, :bedingungen
219
+
220
+ def initialize
221
+ @stimmt = true
222
+ @substantive = []
223
+ @definitionen = {}
224
+ @bedingungen = []
225
+ end
226
+
227
+ def index substantiv_bezeichner
228
+ @substantive.collect{|s| s.bezeichner}.index(substantiv_bezeichner)
229
+ end
230
+
231
+ def hole substantiv_bezeichner
232
+ if index(substantiv_bezeichner)
233
+ @substantive[index(substantiv_bezeichner)]
234
+ else
235
+ Substantiv.new(substantiv_bezeichner)
236
+ end
237
+ end
238
+
239
+ def ist substantiv_bezeichner, adjektiv = nil
240
+ unless index(substantiv_bezeichner)
241
+ @substantive << Substantiv.new(substantiv_bezeichner)
242
+ end
243
+ if adjektiv
244
+ hole(substantiv_bezeichner).ist!(adjektiv)
245
+ end
246
+ end
247
+
248
+ def ist_nicht substantiv_bezeichner, adjektiv = nil
249
+ unless index(substantiv_bezeichner)
250
+ @substantive << Substantiv.new(substantiv_bezeichner)
251
+ end
252
+ if adjektiv
253
+ hole(substantiv_bezeichner).ist_nicht!(adjektiv)
254
+ end
255
+ end
256
+
257
+ def kann substantiv_bezeichner, verb = nil
258
+ unless index(substantiv_bezeichner)
259
+ @substantive << Substantiv.new(substantiv_bezeichner)
260
+ end
261
+ if verb
262
+ hole(substantiv_bezeichner).kann!(verb)
263
+ end
264
+ end
265
+
266
+ def kann_nicht substantiv_bezeichner, verb = nil
267
+ unless index(substantiv_bezeichner)
268
+ @substantive << Substantiv.new(substantiv_bezeichner)
269
+ end
270
+ if verb
271
+ hole(substantiv_bezeichner).kann_nicht!(verb)
272
+ end
273
+ end
274
+
275
+ def hat substantiv_bezeichner, besitz = nil
276
+ unless index(substantiv_bezeichner)
277
+ @substantive << Substantiv.new(substantiv_bezeichner)
278
+ end
279
+ if besitz
280
+ hole(substantiv_bezeichner).hat!(besitz)
281
+ end
282
+ end
283
+
284
+ def hat_nicht substantiv_bezeichner, besitz = nil
285
+ unless index(substantiv_bezeichner)
286
+ @substantive << Substantiv.new(substantiv_bezeichner)
287
+ end
288
+ if besitz
289
+ hole(substantiv_bezeichner).hat_nicht!(besitz)
290
+ end
291
+ end
292
+
293
+ def stimmt? substantiv, zuweisung, wort = nil
294
+ if zuweisung == "ist"
295
+ if (s = hole(substantiv)) and s.ist? wort
296
+ return true
297
+ else
298
+ return false
299
+ end
300
+ end
301
+
302
+ if zuweisung == "kann"
303
+ if (s = hole(substantiv)) and s.kann? wort
304
+ return true
305
+ else
306
+ return false
307
+ end
308
+ end
309
+
310
+ if zuweisung == "hat"
311
+ if (s = hole(substantiv)) and s.hat? wort
312
+ return true
313
+ else
314
+ return false
315
+ end
316
+ end
317
+
318
+ end
319
+
320
+ def zeile_interpretieren zeile
321
+ zeile.gsub! /\beinen\b/, ""
322
+ zeile.gsub! /\beine\b/, ""
323
+ zeile.gsub! /\bein\b/, ""
324
+ zeile.gsub! /\bder\b/, ""
325
+ zeile.gsub! /\bdie\b/, ""
326
+ zeile.gsub! /\bdas\b/, ""
327
+ zeile.gsub! ",", ""
328
+ zeile.gsub! "?", ""
329
+
330
+ woerter, bedingung = zeile.split("wenn")
331
+ woerter = woerter.split if woerter
332
+ bedingung = bedingung.split if bedingung
333
+ bedingung = [] unless bedingung
334
+ if bedingung.length > 1
335
+ zeile.gsub!(/\b\*\b/, woerter[0])
336
+ zeile.gsub!(/\ber\b/, woerter[0])
337
+ zeile.gsub!(/\bsie\b/, woerter[0])
338
+ zeile.gsub!(/\bes\b/, woerter[0])
339
+ @bedingungen << zeile unless @bedingungen.index(zeile) or @aktion
340
+ nicht = bedingung.delete "nicht"
341
+ nicht = bedingung.delete "kein" unless nicht
342
+ nicht = bedingung.delete "keine" unless nicht
343
+ nicht = bedingung.delete "keinen" unless nicht
344
+ logik = bedingung.delete("und") or bedingung.delete("oder")
345
+ if logik == "und"
346
+ stimmt = true
347
+ bedingung[1..-2].each do |eigenschaft|
348
+ stimmt = false unless stimmt? bedingung[0], bedingung[-1], eigenschaft
349
+ end
350
+ elsif logik == "oder"
351
+ stimmt = false
352
+ bedingung[1..-2].each do |eigenschaft|
353
+ stimmt = true if stimmt? bedingung[0], bedingung[-1], eigenschaft
354
+ end
355
+ else
356
+ stimmt = stimmt? bedingung[0], bedingung[2], bedingung[1]
357
+ end
358
+ @stimmt = stimmt
359
+ stimmt = stimmt.! if nicht
360
+ if (woerter.index("kein") or
361
+ woerter.index("keine") or
362
+ woerter.index("keinen") or
363
+ woerter.index("nicht")) and not stimmt
364
+ woerter.delete("nicht")
365
+ woerter.delete("kein")
366
+ woerter.delete("keine")
367
+ woerter.delete("keinen")
368
+ elsif not stimmt
369
+ woerter.insert(2, "nicht")
370
+ end
371
+ end
372
+
373
+ p = " "
374
+
375
+ if woerter.length == 1
376
+ if substantiv = hole(zeile[0..-2])
377
+ puts "#{p}"
378
+ if substantiv.adjektive != []
379
+ puts "#{p} ist:"
380
+ puts substantiv.adjektive.collect{|a| "#{p} - " + a}
381
+ puts "#{p}"
382
+ end
383
+
384
+ if substantiv.besitz != []
385
+ puts "#{p} hat:"
386
+ puts substantiv.besitz.collect{|a| "#{p} - " + a}
387
+ puts "#{p}"
388
+ end
389
+
390
+ if substantiv.verben != []
391
+ puts "#{p} kann:"
392
+ puts substantiv.verben.collect{|a| "#{p} - " + a}
393
+ puts "#{p}"
394
+ end
395
+ if (bedingungen = @bedingungen.collect{ |b|
396
+ "#{p} - " + b if b[substantiv.bezeichner]
397
+ }) != []
398
+ puts "#{p} bedingungen:"
399
+ puts bedingungen
400
+ puts "#{p}"
401
+ end
402
+ end
403
+ if @definitionen.keys.index(zeile[0..-2])
404
+ puts @definitionen[zeile[0..-2]].split("\n").collect{|a| "#{p} - " + a}
405
+ puts "#{p}"
406
+ end
407
+ end
408
+
409
+
410
+
411
+ if woerter.length > 1
412
+ nicht = woerter.delete "nicht"
413
+ nicht = woerter.delete "kein" unless nicht
414
+ nicht = woerter.delete "keine" unless nicht
415
+ nicht = woerter.delete "keinen" unless nicht
416
+ if woerter[1] == "ist"
417
+ if nicht
418
+ ist_nicht woerter[0], woerter[2]
419
+ else
420
+ ist woerter[0], woerter[2]
421
+ end
422
+ end
423
+
424
+ if woerter[1] == "kann"
425
+ if nicht
426
+ kann_nicht woerter[0], woerter[2]
427
+ else
428
+ kann woerter[0], woerter[2]
429
+ end
430
+ end
431
+
432
+ if woerter[1] == "hat"
433
+ if nicht
434
+ hat_nicht woerter[0], woerter[2]
435
+ else
436
+ hat woerter[0], woerter[2]
437
+ end
438
+ end
439
+
440
+ if ["ist", "hat", "kann"].index(woerter[0])
441
+ if stimmt? woerter[1], woerter[0], woerter[2]
442
+ puts " ja"
443
+ else
444
+ puts " nein"
445
+ end
446
+ end
447
+
448
+ if woerter[0] == "vom"
449
+ @definitionen[woerter[1]] = ""
450
+ definieren = true
451
+ while definieren
452
+ zeile = naechste_zeile "... "
453
+ break if zeile == "\n"
454
+ @definitionen[woerter[1]] << zeile
455
+ end
456
+ end
457
+
458
+ if woerter[1] == "tut" and not nicht
459
+ subjektiv = woerter[0]
460
+ verb = woerter[2]
461
+ kann subjektiv, verb
462
+ if (funktion = @definitionen[woerter[2]])
463
+ funktion.split("\n").each do |zeile|
464
+ zeile.gsub!(/\*/, subjektiv)
465
+ zeile.gsub!(/\ber\b/, subjektiv)
466
+ zeile.gsub!(/\bsie\b/, subjektiv)
467
+ zeile.gsub!(/\bes\b/, verb)
468
+ @aktion = true
469
+ zeile_interpretieren zeile
470
+ @aktion = false
471
+ end
472
+ end
473
+ end
474
+ end
475
+ end
476
+ end
477
+
478
+ sprache = Sprache.new
479
+ while true
480
+ sprache.bedingungen.each do |b|
481
+ sprache.zeile_interpretieren b
482
+ end
483
+ zeile = naechste_zeile
484
+ redo unless zeile
485
+ sprache.zeile_interpretieren zeile
486
+ end
data/sprache.rb ADDED
@@ -0,0 +1,359 @@
1
+ #!/usr/bin/ruby
2
+
3
+ require "dbg"
4
+ $zeilen = ARGF.readlines if ARGV[0]
5
+ $zeilen = [] unless $zeilen
6
+ $zeile = -1
7
+
8
+ def naechste_zeile prompt = "> "
9
+ $zeile += 1
10
+ zeile = $zeilen[$zeile] if $zeilen[$zeile]
11
+ unless zeile
12
+ printf prompt
13
+ zeile = STDIN.gets
14
+ end
15
+ unless zeile
16
+ puts
17
+ exit
18
+ end
19
+ zeile.gsub! /\beinen\b/, ""
20
+ zeile.gsub! /\beine\b/, ""
21
+ zeile.gsub! /\bein\b/, ""
22
+ zeile.gsub! /\der\b/, ""
23
+ zeile.gsub! /\die\b/, ""
24
+ zeile.gsub! /\das\b/, ""
25
+ zeile.gsub! ",", ""
26
+ zeile.gsub! "?", ""
27
+ return zeile
28
+ end
29
+
30
+ class Substantiv
31
+ attr_accessor :bezeichner, :adjektive, :verben, :besitz
32
+
33
+ def initialize bezeichner
34
+ @bezeichner = bezeichner
35
+ @adjektive = []
36
+ @verben = []
37
+ @besitz = []
38
+ end
39
+
40
+ def ist? adjektiv = nil
41
+ return true unless adjektiv
42
+ !!@adjektive.index(adjektiv)
43
+ end
44
+
45
+ def ist! adjektiv
46
+ @adjektive << adjektiv unless self.ist?(adjektiv)
47
+ end
48
+
49
+ def ist_nicht! adjektiv
50
+ @adjektive.delete adjektiv
51
+ end
52
+
53
+ def kann? verb = nil
54
+ return true unless verb
55
+ !!@verben.index(verb)
56
+ end
57
+
58
+ def kann! verb
59
+ @verben << verb unless self.kann?(verb)
60
+ end
61
+
62
+ def kann_nicht! verb
63
+ @verben.delete verb
64
+ end
65
+
66
+ def hat? besitz = nil
67
+ return true unless besitz
68
+ !!@besitz.index(besitz)
69
+ end
70
+
71
+ def hat! besitz
72
+ @besitz << besitz unless self.hat?(besitz)
73
+ end
74
+
75
+ def hat_nicht! besitz
76
+ @besitz.delete besitz
77
+ end
78
+ end
79
+
80
+ class Sprache
81
+ attr_accessor :substantive, :bedingungen
82
+
83
+ def initialize
84
+ @stimmt = true
85
+ @substantive = []
86
+ @definitionen = {}
87
+ @bedingungen = []
88
+ end
89
+
90
+ def index substantiv_bezeichner
91
+ @substantive.collect{|s| s.bezeichner}.index(substantiv_bezeichner)
92
+ end
93
+
94
+ def hole substantiv_bezeichner
95
+ if index(substantiv_bezeichner)
96
+ @substantive[index(substantiv_bezeichner)]
97
+ else
98
+ Substantiv.new(substantiv_bezeichner)
99
+ end
100
+ end
101
+
102
+ def ist substantiv_bezeichner, adjektiv = nil
103
+ unless index(substantiv_bezeichner)
104
+ @substantive << Substantiv.new(substantiv_bezeichner)
105
+ end
106
+ if adjektiv
107
+ hole(substantiv_bezeichner).ist!(adjektiv)
108
+ end
109
+ end
110
+
111
+ def ist_nicht substantiv_bezeichner, adjektiv = nil
112
+ unless index(substantiv_bezeichner)
113
+ @substantive << Substantiv.new(substantiv_bezeichner)
114
+ end
115
+ if adjektiv
116
+ hole(substantiv_bezeichner).ist_nicht!(adjektiv)
117
+ end
118
+ end
119
+
120
+ def kann substantiv_bezeichner, verb = nil
121
+ unless index(substantiv_bezeichner)
122
+ @substantive << Substantiv.new(substantiv_bezeichner)
123
+ end
124
+ if verb
125
+ hole(substantiv_bezeichner).kann!(verb)
126
+ end
127
+ end
128
+
129
+ def kann_nicht substantiv_bezeichner, verb = nil
130
+ unless index(substantiv_bezeichner)
131
+ @substantive << Substantiv.new(substantiv_bezeichner)
132
+ end
133
+ if verb
134
+ hole(substantiv_bezeichner).kann_nicht!(verb)
135
+ end
136
+ end
137
+
138
+ def hat substantiv_bezeichner, besitz = nil
139
+ unless index(substantiv_bezeichner)
140
+ @substantive << Substantiv.new(substantiv_bezeichner)
141
+ end
142
+ if besitz
143
+ hole(substantiv_bezeichner).hat!(besitz)
144
+ end
145
+ end
146
+
147
+ def hat_nicht substantiv_bezeichner, besitz = nil
148
+ unless index(substantiv_bezeichner)
149
+ @substantive << Substantiv.new(substantiv_bezeichner)
150
+ end
151
+ if besitz
152
+ hole(substantiv_bezeichner).hat_nicht!(besitz)
153
+ end
154
+ end
155
+
156
+ def stimmt? substantiv, zuweisung, wort = nil
157
+ if zuweisung == "ist"
158
+ if (s = hole(substantiv)) and s.ist? wort
159
+ return true
160
+ else
161
+ return false
162
+ end
163
+ end
164
+
165
+ if zuweisung == "kann"
166
+ if (s = hole(substantiv)) and s.kann? wort
167
+ return true
168
+ else
169
+ return false
170
+ end
171
+ end
172
+
173
+ if zuweisung == "hat"
174
+ if (s = hole(substantiv)) and s.hat? wort
175
+ return true
176
+ else
177
+ return false
178
+ end
179
+ end
180
+
181
+ end
182
+
183
+ def zeile_interpretieren zeile
184
+ zeile.gsub! /\beinen\b/, ""
185
+ zeile.gsub! /\beine\b/, ""
186
+ zeile.gsub! /\bein\b/, ""
187
+ zeile.gsub! /\bder\b/, ""
188
+ zeile.gsub! /\bdie\b/, ""
189
+ zeile.gsub! /\bdas\b/, ""
190
+ zeile.gsub! ",", ""
191
+ zeile.gsub! "?", ""
192
+
193
+ woerter, bedingung = zeile.split("wenn")
194
+ woerter = woerter.split if woerter
195
+ bedingung = bedingung.split if bedingung
196
+ bedingung = [] unless bedingung
197
+ if bedingung.length > 1
198
+ zeile.gsub!(/\b\*\b/, woerter[0])
199
+ zeile.gsub!(/\ber\b/, woerter[0])
200
+ zeile.gsub!(/\bsie\b/, woerter[0])
201
+ zeile.gsub!(/\bes\b/, woerter[0])
202
+ @bedingungen << zeile unless @bedingungen.index(zeile) or @aktion
203
+ nicht = bedingung.delete "nicht"
204
+ nicht = bedingung.delete "kein" unless nicht
205
+ nicht = bedingung.delete "keine" unless nicht
206
+ nicht = bedingung.delete "keinen" unless nicht
207
+ logik = bedingung.delete("und") or bedingung.delete("oder")
208
+ if logik == "und"
209
+ stimmt = true
210
+ bedingung[1..-2].each do |eigenschaft|
211
+ stimmt = false unless stimmt? bedingung[0], bedingung[-1], eigenschaft
212
+ end
213
+ elsif logik == "oder"
214
+ stimmt = false
215
+ bedingung[1..-2].each do |eigenschaft|
216
+ stimmt = true if stimmt? bedingung[0], bedingung[-1], eigenschaft
217
+ end
218
+ else
219
+ stimmt = stimmt? bedingung[0], bedingung[2], bedingung[1]
220
+ end
221
+ @stimmt = stimmt
222
+ stimmt = stimmt.! if nicht
223
+ woerter.insert(2, "nicht") unless stimmt
224
+ end
225
+
226
+ if woerter.length == 1
227
+ if substantiv = hole(zeile[0..-2])
228
+ puts "#"
229
+ if substantiv.adjektive != []
230
+ puts "# ist:"
231
+ puts substantiv.adjektive.collect{|a| "# - " + a}
232
+ puts "#"
233
+ end
234
+
235
+ if substantiv.besitz != []
236
+ puts "# hat:"
237
+ puts substantiv.besitz.collect{|a| "# - " + a}
238
+ puts "#"
239
+ end
240
+
241
+ if substantiv.verben != []
242
+ puts "# kann:"
243
+ puts substantiv.verben.collect{|a| "# - " + a}
244
+ puts "#"
245
+ end
246
+ if (bedingungen = @bedingungen.collect{ |b|
247
+ "# - " + b if b[substantiv.bezeichner]
248
+ }) != []
249
+ puts "# bedingungen:"
250
+ puts bedingungen
251
+ puts "#"
252
+ end
253
+ end
254
+ if @definitionen.keys.index(zeile[0..-2])
255
+ puts @definitionen[zeile[0..-2]].split("\n").collect{|a| "# - " + a}
256
+ puts
257
+ end
258
+ end
259
+
260
+ if woerter.delete("und") or woerter.delete("aber")
261
+ zeilen = []
262
+ woerter[2..-1].each do |wort|
263
+ zeilen << (woerter[0..1]+ [wort]).join(" ")
264
+ end
265
+
266
+ zeilen.each_with_index do |zeile, i|
267
+ zeile = zeile.dup.split()
268
+ if ["nicht", "kein", "keine", "keinen"].index(zeile[-1])
269
+ nicht_einfuegen = true
270
+ zeilen.delete_at(i)
271
+ end
272
+ if nicht_einfuegen
273
+ zeilen[i] = zeilen[i].split.insert(2, "nicht").join(" ")
274
+ nicht_einfuegen = false
275
+ end
276
+ end
277
+ zeilen.each do |zeile|
278
+ zeile = zeile.split.insert(2, "nicht").join(" ") unless @stimmt
279
+ zeile_interpretieren(zeile)
280
+ end
281
+ @stimmt = true
282
+ end
283
+
284
+ if woerter.length > 1
285
+ nicht = woerter.delete "nicht"
286
+ nicht = woerter.delete "kein" unless nicht
287
+ nicht = woerter.delete "keine" unless nicht
288
+ nicht = woerter.delete "keinen" unless nicht
289
+ if woerter[1] == "ist"
290
+ if nicht
291
+ ist_nicht woerter[0], woerter[2]
292
+ else
293
+ ist woerter[0], woerter[2]
294
+ end
295
+ end
296
+
297
+ if woerter[1] == "kann"
298
+ if nicht
299
+ kann_nicht woerter[0], woerter[2]
300
+ else
301
+ kann woerter[0], woerter[2]
302
+ end
303
+ end
304
+
305
+ if woerter[1] == "hat"
306
+ if nicht
307
+ hat_nicht woerter[0], woerter[2]
308
+ else
309
+ hat woerter[0], woerter[2]
310
+ end
311
+ end
312
+
313
+ if ["ist", "hat", "kann"].index(woerter[0])
314
+ if stimmt? woerter[1], woerter[0], woerter[2]
315
+ puts " ja"
316
+ else
317
+ puts " nein"
318
+ end
319
+ end
320
+
321
+ if woerter[0] == "vom"
322
+ @definitionen[woerter[1]] = ""
323
+ definieren = true
324
+ while definieren
325
+ zeile = naechste_zeile "... "
326
+ break if zeile == "\n"
327
+ @definitionen[woerter[1]] << zeile
328
+ end
329
+ end
330
+
331
+ if woerter[1] == "tut" and not nicht
332
+ hole(woerter[0]).kann! woerter[2]
333
+ subjektiv = woerter[0]
334
+ verb = woerter[2]
335
+ if (funktion = @definitionen[woerter[2]])
336
+ funktion.split("\n").each do |zeile|
337
+ zeile.gsub!(/\*/, subjektiv)
338
+ zeile.gsub!(/\ber\b/, subjektiv)
339
+ zeile.gsub!(/\bsie\b/, subjektiv)
340
+ zeile.gsub!(/\bes\b/, verb)
341
+ @aktion = true
342
+ zeile_interpretieren zeile
343
+ @aktion = false
344
+ end
345
+ end
346
+ end
347
+ end
348
+ end
349
+ end
350
+
351
+ sprache = Sprache.new
352
+ while true
353
+ sprache.bedingungen.each do |b|
354
+ sprache.zeile_interpretieren b
355
+ end
356
+ zeile = naechste_zeile
357
+ redo unless zeile
358
+ sprache.zeile_interpretieren zeile
359
+ end
metadata ADDED
@@ -0,0 +1,48 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: sprache
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Justin Massey
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-11-06 00:00:00.000000000 Z
13
+ dependencies: []
14
+ description:
15
+ email:
16
+ - sudoer86@gmail.com
17
+ executables:
18
+ - sprache
19
+ extensions: []
20
+ extra_rdoc_files: []
21
+ files:
22
+ - sprache.rb
23
+ - bin/sprache
24
+ homepage:
25
+ licenses: []
26
+ post_install_message:
27
+ rdoc_options: []
28
+ require_paths:
29
+ - lib
30
+ required_ruby_version: !ruby/object:Gem::Requirement
31
+ none: false
32
+ requirements:
33
+ - - ! '>='
34
+ - !ruby/object:Gem::Version
35
+ version: '0'
36
+ required_rubygems_version: !ruby/object:Gem::Requirement
37
+ none: false
38
+ requirements:
39
+ - - ! '>='
40
+ - !ruby/object:Gem::Version
41
+ version: 1.3.6
42
+ requirements: []
43
+ rubyforge_project:
44
+ rubygems_version: 1.8.11
45
+ signing_key:
46
+ specification_version: 3
47
+ summary: experimentele skriptsprache mit tutorial
48
+ test_files: []