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.
- data/bin/sprache +486 -0
- data/sprache.rb +359 -0
- 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: []
|