sprache 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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: []