shen-ruby 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
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
+