shen-ruby 0.1.0

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 (117) hide show
  1. data/.gitignore +4 -0
  2. data/.rspec +0 -0
  3. data/Gemfile +6 -0
  4. data/Gemfile.lock +20 -0
  5. data/MIT_LICENSE.txt +26 -0
  6. data/README.md +94 -0
  7. data/bin/shen_test_suite.rb +9 -0
  8. data/bin/srrepl +23 -0
  9. data/lib/kl.rb +7 -0
  10. data/lib/kl/absvector.rb +12 -0
  11. data/lib/kl/compiler.rb +253 -0
  12. data/lib/kl/cons.rb +51 -0
  13. data/lib/kl/empty_list.rb +12 -0
  14. data/lib/kl/environment.rb +123 -0
  15. data/lib/kl/error.rb +4 -0
  16. data/lib/kl/internal_error.rb +7 -0
  17. data/lib/kl/lexer.rb +186 -0
  18. data/lib/kl/primitives/arithmetic.rb +60 -0
  19. data/lib/kl/primitives/assignments.rb +18 -0
  20. data/lib/kl/primitives/booleans.rb +17 -0
  21. data/lib/kl/primitives/error_handling.rb +13 -0
  22. data/lib/kl/primitives/generic_functions.rb +22 -0
  23. data/lib/kl/primitives/lists.rb +21 -0
  24. data/lib/kl/primitives/streams.rb +38 -0
  25. data/lib/kl/primitives/strings.rb +55 -0
  26. data/lib/kl/primitives/symbols.rb +17 -0
  27. data/lib/kl/primitives/time.rb +17 -0
  28. data/lib/kl/primitives/vectors.rb +30 -0
  29. data/lib/kl/reader.rb +40 -0
  30. data/lib/kl/trampoline.rb +14 -0
  31. data/lib/shen_ruby.rb +7 -0
  32. data/lib/shen_ruby/version.rb +3 -0
  33. data/shen-ruby.gemspec +26 -0
  34. data/shen/README.txt +17 -0
  35. data/shen/lib/shen_ruby/shen.rb +124 -0
  36. data/shen/license.txt +34 -0
  37. data/shen/release/benchmarks/N_queens.shen +45 -0
  38. data/shen/release/benchmarks/README.shen +14 -0
  39. data/shen/release/benchmarks/benchmarks.shen +56 -0
  40. data/shen/release/benchmarks/bigprog +2173 -0
  41. data/shen/release/benchmarks/br.shen +13 -0
  42. data/shen/release/benchmarks/einstein.shen +33 -0
  43. data/shen/release/benchmarks/heatwave.gif +0 -0
  44. data/shen/release/benchmarks/interpreter.shen +219 -0
  45. data/shen/release/benchmarks/picture.jpg +0 -0
  46. data/shen/release/benchmarks/plato.jpg +0 -0
  47. data/shen/release/benchmarks/powerset.shen +10 -0
  48. data/shen/release/benchmarks/prime.shen +10 -0
  49. data/shen/release/benchmarks/short.shen +129 -0
  50. data/shen/release/benchmarks/text.txt +68 -0
  51. data/shen/release/k_lambda/core.kl +1002 -0
  52. data/shen/release/k_lambda/declarations.kl +1021 -0
  53. data/shen/release/k_lambda/load.kl +94 -0
  54. data/shen/release/k_lambda/macros.kl +479 -0
  55. data/shen/release/k_lambda/prolog.kl +1309 -0
  56. data/shen/release/k_lambda/reader.kl +1058 -0
  57. data/shen/release/k_lambda/sequent.kl +556 -0
  58. data/shen/release/k_lambda/sys.kl +582 -0
  59. data/shen/release/k_lambda/t-star.kl +3493 -0
  60. data/shen/release/k_lambda/toplevel.kl +223 -0
  61. data/shen/release/k_lambda/track.kl +208 -0
  62. data/shen/release/k_lambda/types.kl +455 -0
  63. data/shen/release/k_lambda/writer.kl +108 -0
  64. data/shen/release/k_lambda/yacc.kl +280 -0
  65. data/shen/release/test_programs/Chap13/problems.txt +26 -0
  66. data/shen/release/test_programs/README.shen +53 -0
  67. data/shen/release/test_programs/TinyLispFunctions.txt +16 -0
  68. data/shen/release/test_programs/TinyTypes.shen +55 -0
  69. data/shen/release/test_programs/binary.shen +24 -0
  70. data/shen/release/test_programs/bubble_version_1.shen +28 -0
  71. data/shen/release/test_programs/bubble_version_2.shen +22 -0
  72. data/shen/release/test_programs/calculator.shen +21 -0
  73. data/shen/release/test_programs/cartprod.shen +23 -0
  74. data/shen/release/test_programs/change.shen +25 -0
  75. data/shen/release/test_programs/classes-defaults.shen +94 -0
  76. data/shen/release/test_programs/classes-inheritance.shen +100 -0
  77. data/shen/release/test_programs/classes-typed.shen +74 -0
  78. data/shen/release/test_programs/classes-untyped.shen +46 -0
  79. data/shen/release/test_programs/depth_.shen +14 -0
  80. data/shen/release/test_programs/einstein.shen +33 -0
  81. data/shen/release/test_programs/fruit_machine.shen +46 -0
  82. data/shen/release/test_programs/interpreter.shen +219 -0
  83. data/shen/release/test_programs/metaprog.shen +85 -0
  84. data/shen/release/test_programs/minim.shen +193 -0
  85. data/shen/release/test_programs/mutual.shen +11 -0
  86. data/shen/release/test_programs/n_queens.shen +45 -0
  87. data/shen/release/test_programs/newton_version_1.shen +33 -0
  88. data/shen/release/test_programs/newton_version_2.shen +24 -0
  89. data/shen/release/test_programs/parse.prl +14 -0
  90. data/shen/release/test_programs/parser.shen +52 -0
  91. data/shen/release/test_programs/powerset.shen +10 -0
  92. data/shen/release/test_programs/prime.shen +10 -0
  93. data/shen/release/test_programs/proof_assistant.shen +81 -0
  94. data/shen/release/test_programs/proplog_version_1.shen +25 -0
  95. data/shen/release/test_programs/proplog_version_2.shen +27 -0
  96. data/shen/release/test_programs/qmachine.shen +67 -0
  97. data/shen/release/test_programs/red-black.shen +55 -0
  98. data/shen/release/test_programs/search.shen +56 -0
  99. data/shen/release/test_programs/semantic_net.shen +44 -0
  100. data/shen/release/test_programs/spreadsheet.shen +35 -0
  101. data/shen/release/test_programs/stack.shen +27 -0
  102. data/shen/release/test_programs/streams.shen +20 -0
  103. data/shen/release/test_programs/strings.shen +59 -0
  104. data/shen/release/test_programs/structures-typed.shen +71 -0
  105. data/shen/release/test_programs/structures-untyped.shen +42 -0
  106. data/shen/release/test_programs/tests.shen +294 -0
  107. data/shen/release/test_programs/types.shen +11 -0
  108. data/shen/release/test_programs/whist.shen +240 -0
  109. data/shen/release/test_programs/yacc.shen +136 -0
  110. data/spec/kl/cons_spec.rb +12 -0
  111. data/spec/kl/environment_spec.rb +306 -0
  112. data/spec/kl/lexer_spec.rb +149 -0
  113. data/spec/kl/primitives/generic_functions_spec.rb +29 -0
  114. data/spec/kl/primitives/symbols_spec.rb +21 -0
  115. data/spec/kl/reader_spec.rb +36 -0
  116. data/spec/spec_helper.rb +2 -0
  117. metadata +189 -0
@@ -0,0 +1,46 @@
1
+ (define defclass
2
+ Class Attributes
3
+ -> (let Assoc (map (/. Attribute [Attribute | fail]) Attributes)
4
+ ClassDef [[class | Class] | Assoc]
5
+ Store (put Class classdef ClassDef)
6
+ Class))
7
+
8
+ (define make-instance
9
+ Class -> (let ClassDef (trap-error (get Class classdef) (/. E []))
10
+ (if (empty? ClassDef)
11
+ (error "class ~A does not exist~%" Class)
12
+ ClassDef)))
13
+
14
+ (define get-value
15
+ Attribute Instance -> (let LookUp (assoc Attribute Instance)
16
+ (get-value-test LookUp)))
17
+
18
+ (define get-value-test
19
+ [ ] -> (error "no such attribute!~%")
20
+ [_ | fail] -> (error "no such value!~%")
21
+ [_ | Value] -> Value)
22
+
23
+ (define has-value?
24
+ Attribute Instance -> (let LookUp (assoc Attribute Instance)
25
+ (has-value-test LookUp)))
26
+
27
+ (define has-value-test
28
+ [ ] -> (error "no such attribute!~%")
29
+ [_ | fail] -> false
30
+ _ -> true)
31
+
32
+ (define has-attribute?
33
+ Attribute Instance -> (let LookUp (assoc Attribute Instance)
34
+ (not (empty? LookUp))))
35
+
36
+ (define change-value
37
+ _ class _ -> (error "cannot change the class of an instance!~%")
38
+ [ ] _ _ -> (error "no such attribute!~%")
39
+ [[Attribute | _] | Instance] Attribute Value
40
+ -> [[Attribute | Value] | Instance]
41
+ [Slot | Instance] Attribute Value
42
+ -> [Slot | (change-value Instance Attribute Value)])
43
+
44
+ (define instance-of
45
+ [[class | Class] | _] -> Class
46
+ _ -> (error "not a class instance!"))
@@ -0,0 +1,14 @@
1
+ (define depth'
2
+ {A --> (A --> (list A)) --> (A --> boolean) --> (A --> boolean) --> (list A)}
3
+ State Successors Goal? Fail? -> (depth-help' [State] Successors Goal? Fail? []))
4
+
5
+ (define depth-help'
6
+ {(list A) --> (A --> (list A)) --> (A --> boolean) --> (A --> boolean) --> (list A) --> (list A)}
7
+ [State | _] _ Goal? _ Path -> (reverse [State | Path]) where (Goal? State)
8
+ [State | _] _ _ Fail? _ -> [] where (Fail? State)
9
+ [State | _] Successors Goal? Fail? Path <- (fail-if empty?
10
+ (depth-help' (Successors State)
11
+ Successors Goal? Fail? [State | Path]))
12
+ [_ | States] Successors Goal? Fail? Path -> (depth-help' States Successors Goal? Fail? Path)
13
+ _ _ _ _ _ -> [])
14
+
@@ -0,0 +1,33 @@
1
+ (defprolog einsteins_riddle
2
+ Fish_Owner <-- (einstein Houses Fish_Owner);)
3
+
4
+ (defprolog einstein
5
+ Houses Fish_Owner <-- (unify Houses [[house norwegian _ _ _ _] _ [house _ _ _ milk _] _ _])
6
+ (member [house brit _ _ _ red] Houses)
7
+ (member [house swede dog _ _ _] Houses)
8
+ (member [house dane _ _ tea _] Houses)
9
+ (iright [house _ _ _ _ green] [house _ _ _ _ white] Houses)
10
+ (member [house _ _ _ coffee green] Houses)
11
+ (member [house _ bird pallmall _ _] Houses)
12
+ (member [house _ _ dunhill _ yellow] Houses)
13
+ (next_to [house _ _ dunhill _ _] [house _ horse _ _ _] Houses)
14
+ (member [house _ _ _ milk _] Houses)
15
+ (next_to [house _ _ marlboro _ _] [house _ cat _ _ _] Houses)
16
+ (next_to [house _ _ marlboro _ _] [house _ _ _ water _] Houses)
17
+ (member [house _ _ winfield beer _] Houses)
18
+ (member [house german _ rothmans _ _] Houses)
19
+ (next_to [house norwegian _ _ _ _] [house _ _ _ _ blue] Houses)
20
+ (unify Houses [[house norwegian _ _ _ _] _ [house _ _ _ milk _] _ _])
21
+ (member [house Fish_Owner fish _ _ _] Houses);)
22
+
23
+ (defprolog member
24
+ X [X | _] <--;
25
+ X [_ | Z] <-- (member X Z);)
26
+
27
+ (defprolog next_to
28
+ X Y List <-- (iright X Y List);
29
+ X Y List <-- (iright Y X List);)
30
+
31
+ (defprolog iright
32
+ L R [L | [R | _]] <--;
33
+ L R [_ | Rest] <-- (iright L R Rest);)
@@ -0,0 +1,46 @@
1
+ (define return-fruit
2
+ 0 -> cherry
3
+ 1 -> cherry
4
+ 2 -> cherry
5
+ 3 -> cherry
6
+ 4 -> cherry
7
+ 5 -> pear
8
+ 6 -> pear
9
+ 7 -> pear
10
+ 8 -> pear
11
+ 9 -> orange
12
+ 10 -> orange
13
+ 11 -> orange
14
+ 12 -> pineapple
15
+ 13 -> pineapple
16
+ 14 -> lemon)
17
+
18
+ (define spin-wheel
19
+ -> (return-fruit (random 14)))
20
+
21
+ (define payoff
22
+ cherry cherry cherry -> 60
23
+ pear pear pear -> 100
24
+ orange orange orange -> 200
25
+ pineapple pineapple pineapple -> 300
26
+ lemon lemon lemon -> 500
27
+ cherry cherry X -> 10
28
+ X cherry cherry -> 10
29
+ pear pear X -> 20
30
+ X pear pear -> 20
31
+ orange orange X -> 30
32
+ X orange orange -> 30
33
+ pineapple pineapple X -> 40
34
+ X pineapple pineapple -> 40
35
+ lemon lemon X -> 50
36
+ X lemon lemon -> 50
37
+ X Y Z -> 0)
38
+
39
+ (define fruit-machine
40
+ start -> (announce-payoff (spin-wheel) (spin-wheel) (spin-wheel)))
41
+
42
+ (define announce-payoff
43
+ Fruit1 Fruit2 Fruit3
44
+ -> (output "~A ~A ~A~%You win ~A pence~%"
45
+ Fruit1 Fruit2 Fruit3 (payoff Fruit1 Fruit2 Fruit3)))
46
+
@@ -0,0 +1,219 @@
1
+ (datatype num
2
+
3
+ ____________________________________
4
+ (number? X) : verified >> X : number;)
5
+
6
+ (datatype primitive_object
7
+
8
+ if (variable? X)
9
+ _______________
10
+ X : variable;
11
+
12
+ X : variable;
13
+ _____________
14
+ X : primitive_object;
15
+
16
+ X : symbol;
17
+ ___________
18
+ X : primitive_object;
19
+
20
+ X : string;
21
+ ___________
22
+ X : primitive_object;
23
+
24
+ X : boolean;
25
+ ___________
26
+ X : primitive_object;
27
+
28
+ X : number;
29
+ ___________
30
+ X : primitive_object;
31
+
32
+ _____________________
33
+ [] : primitive_object;)
34
+
35
+ (datatype pattern
36
+
37
+ X : primitive_object;
38
+ ___________
39
+ X : pattern;
40
+
41
+ P1 : pattern; P2 : pattern;
42
+ ===========================
43
+ [cons P1 P2] : pattern;
44
+
45
+ P1 : pattern; P2 : pattern;
46
+ ===========================
47
+ [@p P1 P2] : pattern;)
48
+
49
+ (datatype l_formula
50
+
51
+ X : pattern;
52
+ _____________
53
+ X : l_formula;
54
+
55
+ X : l_formula; Y : l_formula; Z : l_formula;
56
+ =================================
57
+ [if X Y Z] : l_formula;
58
+
59
+ X : variable; Y : l_formula; Z : l_formula;
60
+ ================================
61
+ [let X Y Z] : l_formula;
62
+
63
+ X : l_formula; Y : l_formula;
64
+ ======================
65
+ [cons X Y] : l_formula;
66
+
67
+ X : l_formula; Y : l_formula;
68
+ ======================
69
+ [@p X Y] : l_formula;
70
+
71
+ X : l_formula; Y : l_formula;
72
+ ======================
73
+ [where X Y] : l_formula;
74
+
75
+ X : l_formula; Y : l_formula;
76
+ ======================
77
+ [= X Y] : l_formula;
78
+
79
+ X : l_formula; Y : l_formula;
80
+ ======================
81
+ [X Y] : l_formula;
82
+
83
+ Xn : (list l_formula);
84
+ ===================
85
+ [cases | Xn] : l_formula;
86
+
87
+ P : pattern; X : l_formula;
88
+ ===========================
89
+ [/. P X] : l_formula;)
90
+
91
+ (define l_interpreter
92
+ {A --> B}
93
+ _ -> (read_eval_print_loop (output "~%L interpreter ~%~%~%~%l-interp --> ~A~%"
94
+ (normal_form (input+ : l_formula)))))
95
+
96
+ (define read_eval_print_loop
97
+ {string --> A}
98
+ _ -> (read_eval_print_loop
99
+ (output "l-interp --> ~A~%"
100
+ (normal_form (input+ : l_formula)))))
101
+
102
+ (define normal_form
103
+ {l_formula --> l_formula}
104
+ X -> (fix ==> X))
105
+
106
+ (define ==>
107
+ {l_formula --> l_formula}
108
+ [= X Y] -> (let X* (normal_form X)
109
+ (let Y* (normal_form Y)
110
+ (if (or (eval_error? X*) (eval_error? Y*))
111
+ "error!"
112
+ (if (= X* Y*) true false))))
113
+ [[/. P X] Y] -> (let Match (match P (normal_form Y))
114
+ (if (no_match? Match)
115
+ "no match"
116
+ (sub Match X)))
117
+ [if X Y Z] -> (let X* (normal_form X)
118
+ (if (= X* true)
119
+ Y
120
+ (if (= X* false)
121
+ Z
122
+ "error!")))
123
+ [let X Y Z] -> [[/. X Z] Y]
124
+ [@p X Y] -> (let X* (normal_form X)
125
+ (let Y* (normal_form Y)
126
+ (if (or (eval_error? X*) (eval_error? Y*))
127
+ "error!"
128
+ [@p X* Y*])))
129
+ [cons X Y] -> (let X* (normal_form X)
130
+ (let Y* (normal_form Y)
131
+ (if (or (eval_error? X*) (eval_error? Y*))
132
+ "error!"
133
+ [cons X* Y*])))
134
+ [++ X] -> (successor (normal_form X))
135
+ [-- X] -> (predecessor (normal_form X))
136
+ \*[cases X1 | Xn] -> (let Case1 (normal_form X1)
137
+ (if (= Case1 "no match")
138
+ [cases | Xn]
139
+ Case1))
140
+ [cases] -> "error!"
141
+ [where X Y] -> [if X Y "no match"]
142
+ [y-combinator [/. X Y]] -> (replace X [y-combinator [/. X Y]] Y)
143
+ [X Y] -> (let X* (normal_form X)
144
+ (let Y* (normal_form Y)
145
+ (if (or (eval_error? X*) (eval_error? Y*))
146
+ "error!"
147
+ [X* Y*])))*\
148
+ X -> X)
149
+
150
+ (define eval_error?
151
+ {l_formula --> boolean}
152
+ "error!" -> true
153
+ "no match" -> true
154
+ _ -> false)
155
+
156
+ (define successor
157
+ {A --> l_formula}
158
+ X -> (+ 1 X) where (number? X)
159
+ _ -> "error!")
160
+
161
+ (define predecessor
162
+ {A --> l_formula}
163
+ X -> (- X 1) where (number? X)
164
+ _ -> "error!")
165
+
166
+ \* (spy +) *\
167
+
168
+ (define sub
169
+ {[(pattern * l_formula)] --> l_formula --> l_formula}
170
+ [] X -> X
171
+ [(@p Var Val) | Assoc] X -> (sub Assoc (replace Var Val X)))
172
+
173
+ (define match
174
+ {pattern --> l_formula --> (list (pattern * l_formula))}
175
+ P X -> [] where (== P X)
176
+ P X -> [(@p P X)] where (variable? P)
177
+ [cons P1 P2] [cons X Y] -> (let Match1 (match P1 X)
178
+ (if (no_match? Match1)
179
+ Match1
180
+ (let Match2 (match P2 Y)
181
+ (if (no_match? Match2)
182
+ Match2
183
+ (append Match1 Match2)))))
184
+ [@p P1 P2] [@p X Y] -> (let Match1 (match P1 X)
185
+ (if (no_match? Match1)
186
+ Match1
187
+ (let Match2 (match P2 Y)
188
+ (if (no_match? Match2)
189
+ Match2
190
+ (append Match1 Match2)))))
191
+
192
+ _ _ -> [(@p no matching)])
193
+
194
+ (define no_match?
195
+ {[(pattern * l_formula)] --> boolean}
196
+ [(@p no matching)] -> true
197
+ _ -> false)
198
+
199
+ (define replace
200
+ {pattern --> l_formula --> l_formula --> l_formula}
201
+ V W [let V* X Y] -> [let V* X Y] where (== V V*)
202
+ X Y X -> Y
203
+ V W [= X Y] -> [= (replace V W X) (replace V W Y)]
204
+ V W [/. P X] -> [/. P (replace V W X)] where (free? V P)
205
+ V W [if X Y Z] -> [if (replace V W X) (replace V W Y) (replace V W Z)]
206
+ V W [let X Y Z] -> [let X (replace V W Y) (replace V W Z)]
207
+ V W [@p X Y] -> [@p (replace V W X) (replace V W Y)]
208
+ V W [cons X Y] -> [cons (replace V W X) (replace V W Y)]
209
+ V W [cases | Xn] -> [cases | (map (/. Xi (replace V W Xi)) Xn)]
210
+ V W [where X Y] -> [where (replace V W X) (replace V W Y)]
211
+ V W [X Y] -> [(replace V W X) (replace V W Y)]
212
+ _ _ X -> X)
213
+
214
+ (define free?
215
+ {pattern --> pattern --> boolean}
216
+ P P -> false
217
+ P [cons P1 P2] -> (and (free? P P1) (free? P P2))
218
+ P [@p P1 P2] -> (and (free? P P1) (free? P P2))
219
+ _ _ -> true)
@@ -0,0 +1,85 @@
1
+ (define parse
2
+ D Sentence -> (let Parse (D [Sentence []])
3
+ (if (parsed? Parse) (output_parse Parse) ungrammatical)))
4
+
5
+ (define parsed?
6
+ [[] Output] -> true
7
+ _ -> false)
8
+
9
+ (define output_parse
10
+ [_ Output] -> Output)
11
+
12
+ (define generate_parser
13
+ Grammar -> (map compile_rules (group_rules (parenthesise_rules Grammar))))
14
+
15
+ (define parenthesise_rules
16
+ [S --> | Rest] -> (parenthesise_rules1 [S -->] Rest))
17
+
18
+ (define parenthesise_rules1
19
+ Rule [] -> [Rule]
20
+ Rule [S --> | Rest] -> [Rule | (parenthesise_rules1 [S -->] Rest)]
21
+ Rule [X | Y] -> (parenthesise_rules1 (append Rule [X]) Y))
22
+
23
+ (define group_rules
24
+ Rules -> (group_rules1 Rules []))
25
+
26
+ (define group_rules1
27
+ [] Groups -> Groups
28
+ [Rule | Rules] Groups -> (group_rules1 Rules (place_in_group Rule Groups)))
29
+
30
+ (define place_in_group
31
+ Rule [] -> [[Rule]]
32
+ Rule [Group | Groups] -> [[Rule | Group] | Groups]
33
+ where (belongs-in? Rule Group)
34
+ Rule [Group | Groups] -> [Group | (place_in_group Rule Groups)])
35
+
36
+ (define belongs-in?
37
+ [S | _] [[S | _] | _] -> true
38
+ _ _ -> false)
39
+
40
+ (define compile_rules
41
+ Rules -> (if (lex? Rules)
42
+ (generate_code_for_lex Rules)
43
+ (generate_code_for_nonlex Rules)))
44
+
45
+ (define lex?
46
+ [[S --> Terminal] | _] -> (string? Terminal)
47
+ _ -> false)
48
+
49
+ (define generate_code_for_nonlex
50
+ Rules -> (eval (append [define (get_characteristic_non_terminal Rules)
51
+ | (mapapp gcfn_help Rules)]
52
+ [(protect X) -> [fail]])))
53
+
54
+ (define mapapp
55
+ _ [] -> []
56
+ F [X | Y] -> (append (F X) (mapapp F Y)))
57
+
58
+ (define get_characteristic_non_terminal
59
+ [[CNT | _] | _] -> CNT)
60
+
61
+ (define gcfn_help
62
+ Rule -> [(protect Parameter)
63
+ <-
64
+ (apply_expansion Rule
65
+ [listit [head (protect Parameter)]
66
+ [cons [listit | Rule]
67
+ [head [tail (protect Parameter)]]]])])
68
+
69
+ (define apply_expansion
70
+ [CNT --> | Expansion] Parameter -> (ae_help Expansion Parameter))
71
+
72
+ (define ae_help
73
+ [] Code -> Code
74
+ [NT | Expansion] Code -> (ae_help Expansion [NT Code]))
75
+
76
+ (define generate_code_for_lex
77
+ Rules -> (eval (append [define (get_characteristic_non_terminal Rules)
78
+ (protect X) -> [fail] where [= (protect X) [fail]]
79
+ | (mapapp gcfl_help Rules)]
80
+ [(protect X) -> [fail]])))
81
+
82
+ (define gcfl_help
83
+ [CNT --> Terminal] -> [[cons [cons Terminal (protect P)] [cons (protect Parse) []]]
84
+ -> [listit (protect P) [cons [listit CNT --> Terminal] (protect Parse)]]])
85
+