story-gen 0.0.2 → 0.0.3
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/.yardopts +2 -0
- data/README.md +19 -10
- data/bin/story +11 -3
- data/lib/story/compile.rb +17 -3
- data/lib/story/samples_dir.rb +1 -1
- data/sample/fight_club.sdl +2 -0
- data/sample/university.sdl +2 -0
- data/sample//320/261/320/276/320/271/321/206/320/276/320/262/321/201/320/272/320/270/320/271_/320/272/320/273/321/203/320/261.sdl +2 -0
- data/sample//321/203/320/275/320/270/320/262/320/265/321/200/321/201/320/270/321/202/320/265/321/202.sdl +2 -0
- data/sample//321/203/320/275/320/270/320/262/320/265/321/200/321/201/320/270/321/202/320/265/321/202_2.sdl +71 -0
- metadata +3 -2
data/.yardopts
CHANGED
data/README.md
CHANGED
@@ -258,11 +258,6 @@ Top-level statements may also be delimited with dot ("."):
|
|
258
258
|
"Sabrina" is a girl.
|
259
259
|
"John" loves "Liza".
|
260
260
|
|
261
|
-
"If" statement may include a comma before `then` and `or`:
|
262
|
-
|
263
|
-
If X is a boy, then "we know "X,
|
264
|
-
or if Y is a girl, then "we know "Y
|
265
|
-
|
266
261
|
There is another form of the statements combination:
|
267
262
|
|
268
263
|
if X is a boy then:
|
@@ -274,11 +269,25 @@ Keywords `if`, `either`, `or`, `for` (in `for all`) and `while` may start with a
|
|
274
269
|
|
275
270
|
You may also use russian keywords! ;)
|
276
271
|
|
277
|
-
|
278
|
-
|
272
|
+
### Mods ###
|
273
|
+
|
274
|
+
When `-m` or `--allow-comma-in-facts` is passed to `story`, the optional comma in "while" and "for all" becomes disallowed:
|
275
|
+
|
276
|
+
For all A, B, C loves D, "Love quadrangle!"; /* ERROR, ambiguity! */
|
277
|
+
For all A, B, C loves D: "Love quadrangle!". /* OK */
|
278
|
+
For all A, B, C loves D ("Love quadrangle!"); /* OK too */
|
279
|
+
|
280
|
+
Trailing comma in Fact expression is ignored:
|
281
|
+
|
282
|
+
For all X loves Y, ("Someone loves other one!")
|
283
|
+
/* is the same as */
|
284
|
+
For all X loves Y ("Someone loves other one!")
|
279
285
|
|
280
|
-
|
286
|
+
If (A loves B,) and (B loves C,) then ...
|
287
|
+
/* is the same as */
|
288
|
+
If (A loves B) and (B loves C) then ...
|
281
289
|
|
282
|
-
|
290
|
+
Examples
|
291
|
+
--------
|
283
292
|
|
284
|
-
|
293
|
+
See them in "sample" directory (you may get it with `story --samples`)! Or in YARD doc's "File list"!
|
data/bin/story
CHANGED
@@ -6,6 +6,7 @@ require 'story/samples_dir'
|
|
6
6
|
$output_file = nil
|
7
7
|
$input_file = nil
|
8
8
|
$story_class_name = nil
|
9
|
+
$allow_comma_in_facts = false
|
9
10
|
$process = lambda do |story_class_code, output|
|
10
11
|
# execute the story
|
11
12
|
story_class = eval story_class_code
|
@@ -34,14 +35,19 @@ OptionParser.new do |opts|
|
|
34
35
|
"instead of an anonymous class" do |name|
|
35
36
|
$story_class_name = name
|
36
37
|
end
|
37
|
-
opts.on "-
|
38
|
+
opts.on "-m", "--allow-comma-in-facts", "Allow `,' in Fact expressions",
|
39
|
+
"(see `Mods' in README)" do
|
40
|
+
$allow_comma_in_facts = true
|
41
|
+
end
|
42
|
+
opts.on "-r", "--show-relations", "Show relations mentioned in the story",
|
43
|
+
"(useful for debug)" do
|
38
44
|
$process = lambda do |story_class_code, output|
|
39
45
|
story_class = eval story_class_code
|
40
46
|
story = story_class.new
|
41
47
|
story.relations.each { |relation| output.puts relation }
|
42
48
|
end
|
43
49
|
end
|
44
|
-
opts.on "--samples", "Show directory with samples and exit" do
|
50
|
+
opts.on "-S", "--samples", "Show directory with samples and exit" do
|
45
51
|
puts Story::SAMPLES_DIR
|
46
52
|
exit
|
47
53
|
end
|
@@ -61,7 +67,7 @@ begin
|
|
61
67
|
end
|
62
68
|
story_class_code =
|
63
69
|
begin
|
64
|
-
Story.compile(input_text, $input_file || "-")
|
70
|
+
Story.compile(input_text, $input_file || "-", $allow_comma_in_facts)
|
65
71
|
rescue Parse::Error => e
|
66
72
|
abort "error: #{e.pos.file}:#{e.pos.line+1}:#{e.pos.column+1}: #{e.message}"
|
67
73
|
end
|
@@ -84,4 +90,6 @@ begin
|
|
84
90
|
end
|
85
91
|
rescue IOError => e
|
86
92
|
abort "error: #{e.message}"
|
93
|
+
rescue SystemCallError => e
|
94
|
+
abort "error: #{e.message}"
|
87
95
|
end
|
data/lib/story/compile.rb
CHANGED
@@ -21,12 +21,16 @@ class Story
|
|
21
21
|
|
22
22
|
# @param [String] text
|
23
23
|
# @param [String] file a file the +text+ is taken from.
|
24
|
+
# @param [Boolean] allow_comma_in_fact_expr_primary
|
24
25
|
# @return [String] a {String} which {Kernel#eval}s to a {Class} which
|
25
26
|
# inherits {Story}.
|
26
27
|
# @raise [Parse::Error]
|
27
|
-
def self.compile(text, file = "-")
|
28
|
+
def self.compile(text, file = "-", allow_comma_in_fact_expr_primary = false)
|
28
29
|
#
|
29
|
-
c = Parse.new.
|
30
|
+
c = Parse.new.
|
31
|
+
tap { |p| p.allow_comma_in_fact_expr_primary = allow_comma_in_fact_expr_primary }.
|
32
|
+
(text, file).
|
33
|
+
to_code
|
30
34
|
#
|
31
35
|
relation_id_to_var_arg_valuesss_var = Hash.new do |h, relation_id|
|
32
36
|
h[relation_id] = "@#{INTERNAL_VAR_PREFIX}var_arg_valuesss#{h.size}"
|
@@ -594,6 +598,14 @@ class Story
|
|
594
598
|
# @!visibility private
|
595
599
|
class Parse < ::Parse
|
596
600
|
|
601
|
+
# ---------------
|
602
|
+
# @!group Options
|
603
|
+
# ---------------
|
604
|
+
|
605
|
+
# @return [Boolean] is "," in {#fact_expr_primary} allowed? Default is
|
606
|
+
# false.
|
607
|
+
attr_accessor :allow_comma_in_fact_expr_primary
|
608
|
+
|
597
609
|
# --------------
|
598
610
|
# @!group Syntax
|
599
611
|
# --------------
|
@@ -732,12 +744,14 @@ class Story
|
|
732
744
|
end
|
733
745
|
|
734
746
|
rule :fact_expr_primary do
|
747
|
+
allow_comma = allow_comma_in_fact_expr_primary
|
735
748
|
relation_id = []
|
736
749
|
args = []
|
737
750
|
negated = false
|
738
751
|
#
|
739
752
|
one_or_more {
|
740
753
|
_{ s = (_{dash} or _{other_char}) and act { relation_id << s } } or
|
754
|
+
_{ allow_comma and s = comma and act { relation_id << s } } or
|
741
755
|
_{ a = asterisk and act { args << a; relation_id << :* } } or
|
742
756
|
_{ _not_ and act { negated = !negated } } or
|
743
757
|
_{ v = value and act { args << v; relation_id << :* } } or
|
@@ -745,7 +759,7 @@ class Story
|
|
745
759
|
_{ v = above_var and act { args << v; relation_id << :* } } or
|
746
760
|
_{ w = word and act { relation_id << w.ru_downcase } }
|
747
761
|
} and
|
748
|
-
|
762
|
+
act { relation_id.chomp!(",") } and
|
749
763
|
# this is not a "statement_tell" and
|
750
764
|
not relation_id.all? { |p| p == :* } and
|
751
765
|
e = _(FactExpr::Primary[relation_id, args]) and
|
data/lib/story/samples_dir.rb
CHANGED
data/sample/fight_club.sdl
CHANGED
data/sample/university.sdl
CHANGED
@@ -0,0 +1,71 @@
|
|
1
|
+
(прим.: это пример стории, написанной на SDL - Языке Описания Историй)
|
2
|
+
|
3
|
+
"Слава" - самец.
|
4
|
+
"Вова" - самец.
|
5
|
+
"Юрий" - самец.
|
6
|
+
"Борис" - самец.
|
7
|
+
"Гриша" - самец.
|
8
|
+
"Зоя" - самка.
|
9
|
+
"Вика" - самка.
|
10
|
+
"Света" - самка.
|
11
|
+
"Лиля" - самка.
|
12
|
+
"Юля" - самка.
|
13
|
+
|
14
|
+
"
|
15
|
+
Университет
|
16
|
+
===========
|
17
|
+
"
|
18
|
+
nl
|
19
|
+
|
20
|
+
"Как-то раз в университет поступили "; для всех X - самец или X - самка, X", ";
|
21
|
+
"вот. Они быстро стали друзьями и часто гуляли все вместе. "
|
22
|
+
|
23
|
+
Для всех X - самец или X - самка: X свободен.
|
24
|
+
|
25
|
+
Пока * свободен:
|
26
|
+
если X свободен и Y свободен и X <> Y, то:
|
27
|
+
либо:
|
28
|
+
"Как-то раз они все вместе пошли в бар. Было много танцев. ";
|
29
|
+
либо
|
30
|
+
"" (прим.: это значит "ничего не делать")
|
31
|
+
либо:
|
32
|
+
""X" и "Y" танцевали в основном вместе. Они понравились друг другу и вскоре влюбились! ";
|
33
|
+
X любит Y;
|
34
|
+
X не свободен;
|
35
|
+
Y не свободен;
|
36
|
+
.
|
37
|
+
.
|
38
|
+
Либо:
|
39
|
+
"Как-то раз "X" и "Y" встретились в общежитии на кухне. ";
|
40
|
+
либо
|
41
|
+
"Они приятно побеседовали и приготовили вкусный ужин. "
|
42
|
+
либо:
|
43
|
+
"Они очень много беседовали и вместе приготовили отменный ужин. ";
|
44
|
+
"Вскоре они поняли, что любят друг друга! ";
|
45
|
+
X любит Y;
|
46
|
+
X не свободен;
|
47
|
+
Y не свободен;
|
48
|
+
.
|
49
|
+
.
|
50
|
+
Либо:
|
51
|
+
"Как-то раз "X" и "Y" сидели на лекции и постоянно оглядывались друг на друга. ";
|
52
|
+
либо
|
53
|
+
"После лекций они пошли домой и делали уроки. "
|
54
|
+
либо:
|
55
|
+
если ^X - самец, то "После лекций "X" поймал "Y" и сказал ";
|
56
|
+
или если ^X - самка, то "После лекций "X" поймала "Y" и сказала ";
|
57
|
+
если ^Y - самка, то "ей, что любит её! ";
|
58
|
+
или если ^Y - самец, то "ему, что любит его! ";
|
59
|
+
X любит Y;
|
60
|
+
X не свободен;
|
61
|
+
Y не свободен;
|
62
|
+
.
|
63
|
+
.
|
64
|
+
.
|
65
|
+
.
|
66
|
+
|
67
|
+
nl
|
68
|
+
nl
|
69
|
+
"И жили они долго и счастливо!". Если X любит Y и ((X - самец и Y - самец) или (X - самка и Y - самка)), то " Правда, роскомнадзорненько как-то получилось.";
|
70
|
+
nl
|
71
|
+
nl
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: story-gen
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2016-01-
|
12
|
+
date: 2016-01-31 00:00:00.000000000 Z
|
13
13
|
dependencies: []
|
14
14
|
description: Generate stories from descriptions based on Facts!
|
15
15
|
email: various.furriness@gmail.com
|
@@ -46,6 +46,7 @@ files:
|
|
46
46
|
- sample/университет.sdl
|
47
47
|
- sample/бойцовский_клуб.sdl
|
48
48
|
- sample/university.sdl
|
49
|
+
- sample/университет_2.sdl
|
49
50
|
- bin/story
|
50
51
|
homepage:
|
51
52
|
licenses:
|