1: ================================================================================
2:
3: Smalltalk defineClass: #SynapseInterpreter
4: superclass: #{Core.Object}
5: indexedType: #none
6: private: false
7: instanceVariableNames: 'variableDictionary evaluatedScripts currentScript currentProgramNode '
8: classInstanceVariableNames: ''
9: imports: ''
10: category: ''
11:
12: ================================================================================
13:
14: SynapseInterpreter method for 'private'
15:
16: connectionsOf: synapseNode
17:
18: | connections headVariableNode mappingCollection fromVariableName fromMemberName toVariableName toMemberName |
19: connections := OrderedCollection new.
20: headVariableNode := self headVariableNodeOf: synapseNode.
21: mappingCollection := OrderedCollection new.
22: synapseNode allNodesDo:
23: [:aNode |
24: (aNode isInnerNode and: [aNode symbol = #Mapping])
25: ifTrue: [mappingCollection add: aNode]].
26: headVariableNode subNodes size = 1
27: ifTrue:
28: [fromVariableName := headVariableNode subNode subNode token tokenString.
29: fromMemberName := nil]
30: ifFalse:
31: [fromVariableName := headVariableNode subNodes first subNode token tokenString.
32: fromMemberName := headVariableNode subNodes last subNode token tokenString].
33: mappingCollection do:
34: [:mappingNode |
35: | variableNode |
36: mappingNode subNodes size = 4
37: ifTrue:
38: [| memberNameNode |
39: memberNameNode := mappingNode subNodes at: 2.
40: fromMemberName := memberNameNode subNode token tokenString].
41: variableNode := mappingNode subNodes last.
42: variableNode subNodes size = 1
43: ifTrue:
44: [toVariableName := variableNode subNode subNode token tokenString.
45: toMemberName := nil]
46: ifFalse:
47: [toVariableName := variableNode subNodes first subNode token tokenString.
48: toMemberName := variableNode subNodes last subNode token tokenString].
49: connections add: fromVariableName -> fromMemberName -> (toVariableName -> toMemberName).
50: fromVariableName := toVariableName.
51: fromMemberName := nil].
52: ^connections
53:
54: ------------------------------------------------------------
55:
56: SynapseInterpreter method for 'private'
57:
58: createNeuronFrom: assignmentNode
59:
60: | constructorNode aNeuron |
61: constructorNode := assignmentNode subNodes last.
62: aNeuron := self defaultNeuronClass fromConstructorNode: constructorNode.
63: ^aNeuron
64:
65: ------------------------------------------------------------
66:
67: SynapseInterpreter method for 'accessing'
68:
69: currentProgramNode
70:
71: ^currentProgramNode
72:
73: ------------------------------------------------------------
74:
75: SynapseInterpreter method for 'accessing'
76:
77: currentProgramNode: programNode
78:
79: currentProgramNode := programNode
80:
81: ------------------------------------------------------------
82:
83: SynapseInterpreter method for 'accessing'
84:
85: currentScript
86:
87: ^currentScript
88:
89: ------------------------------------------------------------
90:
91: SynapseInterpreter method for 'accessing'
92:
93: currentScript: scriptString
94:
95: currentScript := scriptString.
96: scriptString
97: ifNil: [self currentProgramNode: nil]
98: ifNotNil:
99: [| aScanner aParser programNode |
100: aScanner := self defaultScannerClass scan: scriptString.
101: aParser := self defaultParserClass parse: aScanner tokenCollection.
102: programNode := aParser programNode.
103: programNode symbol = aParser defaultCorrectProgramNodeSymbol
104: ifTrue: [self currentProgramNode: aParser programNode]
105: ifFalse:
106: [self error: 'Parse error. Invalid program node. (' , programNode symbol printString , ')']]
107:
108: ------------------------------------------------------------
109:
110: SynapseInterpreter method for 'defaults'
111:
112: defaultAssignmentNodeSymbol
113:
114: ^#Assignment
115:
116: ------------------------------------------------------------
117:
118: SynapseInterpreter method for 'defaults'
119:
120: defaultNeuronClass
121:
122: ^KSU.SynapseNeuron
123:
124: ------------------------------------------------------------
125:
126: SynapseInterpreter method for 'defaults'
127:
128: defaultParserClass
129:
130: ^KSU.SynapseParser
131:
132: ------------------------------------------------------------
133:
134: SynapseInterpreter method for 'defaults'
135:
136: defaultScannerClass
137:
138: ^KSU.SynapseScanner
139:
140: ------------------------------------------------------------
141:
142: SynapseInterpreter method for 'defaults'
143:
144: defaultSynapseNodeSymbol
145:
146: ^#Synapse
147:
148: ------------------------------------------------------------
149:
150: SynapseInterpreter method for 'evaluating'
151:
152: evaluate: scriptString
153:
154: self currentScript: scriptString.
155: self evaluateAssignments.
156: self evaluateSynapses.
157: self currentScript: nil
158:
159: ------------------------------------------------------------
160:
161: SynapseInterpreter method for 'evaluating'
162:
163: evaluateAssignments
164:
165: | assignmentNodes |
166: assignmentNodes := OrderedCollection new.
167: self currentProgramNode allNodesDo:
168: [:aNode |
169: (aNode isInnerNode and: [aNode symbol = self defaultAssignmentNodeSymbol])
170: ifTrue: [assignmentNodes add: aNode]].
171: assignmentNodes do:
172: [:assignmentNode |
173: | variableName aNeuron |
174: variableName := self variableNameOf: assignmentNode.
175: aNeuron := self createNeuronFrom: assignmentNode.
176: self variableDictionary add: variableName -> aNeuron]
177:
178: ------------------------------------------------------------
179:
180: SynapseInterpreter method for 'accessing'
181:
182: evaluatedScripts
183:
184: evaluatedScripts ifNil: [evaluatedScripts := OrderedCollection new].
185: ^evaluatedScripts
186:
187: ------------------------------------------------------------
188:
189: SynapseInterpreter method for 'evaluating'
190:
191: evaluateSynapses
192:
193: | synapseNodes |
194: synapseNodes := OrderedCollection new.
195: self currentProgramNode allNodesDo:
196: [:aNode |
197: (aNode isInnerNode and: [aNode symbol = self defaultSynapseNodeSymbol])
198: ifTrue: [synapseNodes add: aNode]].
199: synapseNodes do:
200: [:synapseNode |
201: | connections |
202: connections := self connectionsOf: synapseNode.
203: connections do:
204: [:associations |
205: | fromVariableName fromNeuron fromPort toVariableName toNeuron toPort |
206: fromVariableName := associations key key.
207: fromNeuron := self variableDictionary at: fromVariableName
208: ifAbsent: [self error: 'Undefined variable ''' , fromVariableName , '''.'].
209: fromPort := associations key value
210: ifNil: [self defaultNeuronClass defaultOutputPort]
211: ifNotNil: [:aString | aString asSymbol].
212: toVariableName := associations value key.
213: toNeuron := self variableDictionary at: toVariableName
214: ifAbsent: [self error: 'Undefined variable ''' , toVariableName , '''.'].
215: toPort := associations value value
216: ifNil: [self defaultNeuronClass defaultInputPort]
217: ifNotNil: [:aString | aString asSymbol].
218: fromNeuron connect: fromPort toNeuron: toNeuron port: toPort]]
219:
220: ------------------------------------------------------------
221:
222: SynapseInterpreter method for 'execution'
223:
224: execute
225:
226: self variableDictionary
227: do: [:aNeuron | aNeuron isHeadNeuron ifTrue: [aNeuron action]]
228:
229: ------------------------------------------------------------
230:
231: SynapseInterpreter method for 'private'
232:
233: headVariableNodeOf: synapseNode
234:
235: ^synapseNode subNodes first
236:
237: ------------------------------------------------------------
238:
239: SynapseInterpreter method for 'initialize-release'
240:
241: initialize
242:
243: variableDictionary := nil.
244: evaluatedScripts := nil.
245: currentScript := nil.
246: currentProgramNode := nil
247:
248: ------------------------------------------------------------
249:
250: SynapseInterpreter method for 'accessing'
251:
252: variableDictionary
253:
254: variableDictionary ifNil: [variableDictionary := Dictionary new].
255: ^variableDictionary
256:
257: ------------------------------------------------------------
258:
259: SynapseInterpreter method for 'private'
260:
261: variableNameOf: assignmentNode
262:
263: | variableNameNode idNode |
264: variableNameNode := assignmentNode subNodes first.
265: idNode := variableNameNode subNode.
266: ^idNode token tokenString
267:
268: ================================================================================
269:
270: Smalltalk.SynapseInterpreter class
271: instanceVariableNames: ''
272:
273: ================================================================================
274:
275: SynapseInterpreter class method for 'examples'
276:
277: example01
278: "KSU.SynapseInterpreter example01."
279:
280: | scriptString |
281: scriptString := KSU.SynapseInterpreter exampleHoge.
282: ^KSU.SynapseInterpreter script: scriptString
283:
284: ------------------------------------------------------------
285:
286: SynapseInterpreter class method for 'examples'
287:
288: example02
289: "KSU.SynapseInterpreter example02."
290:
291: | scriptString |
292: scriptString := KSU.SynapseInterpreter exampleSimpleHoge.
293: ^KSU.SynapseInterpreter script: scriptString
294:
295: ------------------------------------------------------------
296:
297: SynapseInterpreter class method for 'examples'
298:
299: example03
300: "KSU.SynapseInterpreter example03."
301:
302: | scriptString |
303: scriptString := KSU.SynapseInterpreter exampleMetrics1.
304: ^KSU.SynapseInterpreter script: scriptString
305:
306: ------------------------------------------------------------
307:
308: SynapseInterpreter class method for 'examples'
309:
310: example04
311: "KSU.SynapseInterpreter example04."
312:
313: | scriptString |
314: scriptString := KSU.SynapseInterpreter exampleMetrics2.
315: ^KSU.SynapseInterpreter script: scriptString
316:
317: ------------------------------------------------------------
318:
319: SynapseInterpreter class method for 'examples'
320:
321: example05
322: "KSU.SynapseInterpreter example05."
323:
324: | scriptString |
325: scriptString := KSU.SynapseInterpreter exampleReadFromFile.
326: ^KSU.SynapseInterpreter script: scriptString
327:
328: ------------------------------------------------------------
329:
330: SynapseInterpreter class method for 'examples'
331:
332: example06
333: "KSU.SynapseInterpreter example06."
334:
335: | scriptString |
336: scriptString := KSU.SynapseInterpreter exampleWriteToFile.
337: ^KSU.SynapseInterpreter script: scriptString
338:
339: ------------------------------------------------------------
340:
341: SynapseInterpreter class method for 'examples'
342:
343: example07
344: "KSU.SynapseInterpreter example07."
345:
346: | scriptString |
347: scriptString := KSU.SynapseInterpreter exampleAppendToFile.
348: ^KSU.SynapseInterpreter script: scriptString
349:
350: ------------------------------------------------------------
351:
352: SynapseInterpreter class method for 'examples'
353:
354: example08
355: "KSU.SynapseInterpreter example08."
356:
357: | scriptString |
358: scriptString := KSU.SynapseInterpreter exampleInvalidFileOperation.
359: ^KSU.SynapseInterpreter script: scriptString
360:
361: ------------------------------------------------------------
362:
363: SynapseInterpreter class method for 'examples'
364:
365: example09
366: "KSU.SynapseInterpreter example09."
367:
368: | scriptString |
369: scriptString := KSU.SynapseInterpreter exampleForGettingInputOutputSymbols.
370: ^KSU.SynapseInterpreter script: scriptString
371:
372: ------------------------------------------------------------
373:
374: SynapseInterpreter class method for 'examples'
375:
376: example0A
377: "KSU.SynapseInterpreter example0A."
378:
379: | scriptString |
380: scriptString := KSU.SynapseInterpreter exampleEcho.
381: ^KSU.SynapseInterpreter script: scriptString
382:
383: ------------------------------------------------------------
384:
385: SynapseInterpreter class method for 'examples'
386:
387: example0B
388: "KSU.SynapseInterpreter example0B."
389:
390: | anInterpreter |
391: anInterpreter := KSU.SynapseInterpreter new.
392: anInterpreter
393: evaluate: 'value = Value("This is sample SynapseScript on exampleB.");';
394: evaluate: 'metrics = Metrics("/Users/Miyazaki/Desktop/Echo");';
395: evaluate: 'transcript = Transcript();';
396: yourself.
397: Dialog warn: 'here! [1]'.
398: anInterpreter execute.
399: Dialog warn: 'here! [2]'.
400: anInterpreter evaluate: 'value to: metrics to: transcript;'.
401: Dialog warn: 'here! [3]'.
402: anInterpreter execute.
403: Dialog warn: 'here! [4]'.
404: anInterpreter execute
405:
406: ------------------------------------------------------------
407:
408: SynapseInterpreter class method for 'examples'
409:
410: example0C
411: "KSU.SynapseInterpreter example0C."
412:
413: | anInterpreter |
414: anInterpreter := KSU.SynapseInterpreter new.
415: anInterpreter
416: evaluate: '/* Assignments */';
417: evaluate: 'value = Value("This is sample SynapseScript on exampleB.");';
418: evaluate: 'metrics = Metrics("/Users/Miyazaki/Desktop/Echo");';
419: evaluate: 'transcript = Transcript();';
420: evaluate: '/* Synapses */';
421: evaluate: 'value send: output to: metrics.input send: output to: transcript.input;';
422: yourself.
423: anInterpreter execute
424:
425: ------------------------------------------------------------
426:
427: SynapseInterpreter class method for 'examples'
428:
429: example0D
430: "KSU.SynapseInterpreter example0D."
431:
432: | anInterpreter |
433: anInterpreter := KSU.SynapseInterpreter new.
434: anInterpreter
435: evaluate: '/* Assignments */';
436: evaluate: 'value = Value("This is sample SynapseScript on exampleB.");';
437: evaluate: 'metrics = Metrics("/Users/Miyazaki/Desktop/Echo");';
438: evaluate: 'transcript = Transcript();';
439: evaluate: '/* Synapses */';
440: evaluate: 'value to: metrics to: metrics to: transcript;';
441: yourself.
442: anInterpreter execute
443:
444: ------------------------------------------------------------
445:
446: SynapseInterpreter class method for 'examples'
447:
448: example0E
449: "KSU.SynapseInterpreter example0E."
450:
451: | anInterpreter |
452: anInterpreter := KSU.SynapseInterpreter new.
453: anInterpreter
454: evaluate: '/* Assignments */';
455: evaluate: 'value = Value("This is sample SynapseScript on exampleB.");';
456: evaluate: 'metrics1 = Metrics("/Users/Miyazaki/Desktop/Echo");';
457: evaluate: 'metrics2 = Metrics("/Users/Miyazaki/Desktop/Echo");';
458: evaluate: 'metrics3 = Metrics("/Users/Miyazaki/Desktop/Echo");';
459: evaluate: 'metrics4 = Metrics("/Users/Miyazaki/Desktop/Echo");';
460: evaluate: 'metrics5 = Metrics("/Users/Miyazaki/Desktop/Echo");';
461: evaluate: 'metrics6 = Metrics("/Users/Miyazaki/Desktop/Echo");';
462: evaluate: 'metrics7 = Metrics("/Users/Miyazaki/Desktop/Echo");';
463: evaluate: 'metrics8 = Metrics("/Users/Miyazaki/Desktop/Echo");';
464: evaluate: 'metrics9 = Metrics("/Users/Miyazaki/Desktop/Echo");';
465: evaluate: 'metrics10 = Metrics("/Users/Miyazaki/Desktop/Echo");';
466: evaluate: 'metrics11 = Metrics("/Users/Miyazaki/Desktop/Echo");';
467: evaluate: 'metrics12 = Metrics("/Users/Miyazaki/Desktop/Echo");';
468: evaluate: 'metrics13 = Metrics("/Users/Miyazaki/Desktop/Echo");';
469: evaluate: 'metrics14 = Metrics("/Users/Miyazaki/Desktop/Echo");';
470: evaluate: 'metrics15 = Metrics("/Users/Miyazaki/Desktop/Echo");';
471: evaluate: 'metrics16 = Metrics("/Users/Miyazaki/Desktop/Echo");';
472: evaluate: 'transcript = Transcript();';
473: evaluate: '/* Synapses */';
474: evaluate: 'value to: metrics1;';
475: evaluate: 'metrics1 to: metrics2;';
476: evaluate: 'metrics2 to: metrics3;';
477: evaluate: 'metrics3 to: metrics4;';
478: evaluate: 'metrics4 to: metrics5;';
479: evaluate: 'metrics5 to: metrics6;';
480: evaluate: 'metrics6 to: metrics7;';
481: evaluate: 'metrics7 to: metrics8;';
482: evaluate: 'metrics8 to: metrics9;';
483: evaluate: 'metrics9 to: metrics10;';
484: evaluate: 'metrics10 to: metrics11;';
485: evaluate: 'metrics11 to: metrics12;';
486: evaluate: 'metrics12 to: metrics13;';
487: evaluate: 'metrics13 to: metrics14;';
488: evaluate: 'metrics14 to: metrics15;';
489: evaluate: 'metrics15 to: metrics16;';
490: evaluate: 'metrics16 to: transcript;';
491: yourself.
492: anInterpreter execute
493:
494: ------------------------------------------------------------
495:
496: SynapseInterpreter class method for 'examples'
497:
498: example0F
499: "KSU.SynapseInterpreter example0F."
500:
501: | anInterpreter |
502: anInterpreter := KSU.SynapseInterpreter new.
503: anInterpreter
504: evaluate: '/* Assignments */';
505: evaluate: 'value = Value("良い天気です。午後は出かけます。");';
506: evaluate: 'kansai = Metrics("/Users/Miyazaki/Desktop/Kansai");';
507: evaluate: 'transcript = Transcript();';
508: evaluate: 'file = File("/Users/Miyazaki/Desktop/Kansai.txt", "write");';
509: evaluate: '/* Synapses */';
510: evaluate: 'value to: kansai to: transcript;';
511: evaluate: 'kansai to: file;';
512: yourself.
513: anInterpreter execute
514:
515: ------------------------------------------------------------
516:
517: SynapseInterpreter class method for 'examples'
518:
519: example10
520: "KSU.SynapseInterpreter example10."
521:
522: | anInterpreter |
523: anInterpreter := KSU.SynapseInterpreter new.
524: anInterpreter
525: evaluate: '/* Assignments */';
526: evaluate: 'inputFile = File("/Users/Miyazaki/Desktop/Kamigamo.txt", "read");';
527: evaluate: 'kansai = Metrics("/Users/Miyazaki/Desktop/Kansai");';
528: evaluate: 'outputFile = File("/Users/Miyazaki/Desktop/Kansai.txt", "write");';
529: evaluate: 'transcript = Transcript();';
530: evaluate: '/* Synapses */';
531: evaluate: 'inputFile to: kansai to: outputFile;';
532: evaluate: 'kansai to: transcript;';
533: yourself.
534: anInterpreter execute
535:
536: ------------------------------------------------------------
537:
538: SynapseInterpreter class method for 'examples'
539:
540: example11
541: "KSU.SynapseInterpreter example11."
542:
543: | anInterpreter |
544: anInterpreter := KSU.SynapseInterpreter new.
545: anInterpreter
546: evaluate: '/* Assignments */';
547: evaluate: 'value1 = Value("1番目の文字列");';
548: evaluate: 'value2 = Value("2番目の文字列");';
549: evaluate: 'swap = Metrics("/Users/Miyazaki/Desktop/Swap");';
550: evaluate: 'transcript = Transcript();';
551: evaluate: 'file1 = File("/Users/Miyazaki/Desktop/output1.txt", "write");';
552: evaluate: 'file2 = File("/Users/Miyazaki/Desktop/output2.txt", "write");';
553: evaluate: '/* Synapses */';
554: evaluate: 'value1 to: swap.input1 send: output1 to: transcript;';
555: evaluate: 'value2 to: swap.input2 send: output2 to: transcript;';
556: evaluate: 'swap.output1 to: file1;';
557: evaluate: 'swap send: output2 to: file2;';
558: yourself.
559: anInterpreter execute
560:
561: ------------------------------------------------------------
562:
563: SynapseInterpreter class method for 'examples'
564:
565: example12
566: "KSU.SynapseInterpreter example12."
567:
568: | scriptString |
569: scriptString := KSU.SynapseInterpreter exampleEcho2.
570: ^KSU.SynapseInterpreter script: scriptString
571:
572: ------------------------------------------------------------
573:
574: SynapseInterpreter class method for 'examples'
575:
576: example13
577: "KSU.SynapseInterpreter example13."
578:
579: | scriptString |
580: scriptString := KSU.SynapseInterpreter exampleMetrics3.
581: ^KSU.SynapseInterpreter script: scriptString
582:
583: ------------------------------------------------------------
584:
585: SynapseInterpreter class method for 'examples'
586:
587: example14
588: "KSU.SynapseInterpreter example14."
589:
590: | scriptString |
591: scriptString := KSU.SynapseInterpreter exampleMetrics4.
592: ^KSU.SynapseInterpreter script: scriptString
593:
594: ------------------------------------------------------------
595:
596: SynapseInterpreter class method for 'examples'
597:
598: example15
599: "KSU.SynapseInterpreter example15."
600:
601: | scriptString |
602: scriptString := KSU.SynapseInterpreter exampleEcho3.
603: ^KSU.SynapseInterpreter script: scriptString
604:
605: ------------------------------------------------------------
606:
607: SynapseInterpreter class method for 'examples'
608:
609: example16
610: "KSU.SynapseInterpreter example16."
611:
612: | scriptString anInterpreter |
613: scriptString := KSU.SynapseInterpreter exampleCodeSpaghetti.
614: anInterpreter := KSU.SynapseInterpreter script: scriptString.
615: KSU.ShellInterpreter shellScript: 'open /Users/Miyazaki/Desktop/Spaghetti.html'.
616: ^anInterpreter
617:
618: ------------------------------------------------------------
619:
620: SynapseInterpreter class method for 'examples'
621:
622: example17
623: "KSU.SynapseInterpreter example17."
624:
625: | scriptString |
626: scriptString := KSU.SynapseInterpreter exampleMetricsTable.
627: KSU.SynapseInterpreter script: scriptString.
628: KSU.ShellInterpreter shellScript: 'open /Users/Miyazaki/Desktop/MetricsTable.html'
629:
630: ------------------------------------------------------------
631:
632: SynapseInterpreter class method for 'examples - testing'
633:
634: example1ForTesting
635: "KSU.SynapseInterpreter example1ForTesting."
636:
637: | scriptString |
638: scriptString := KSU.SynapseInterpreter exampleCodeSpaghettiForTesting.
639: KSU.SynapseInterpreter script: scriptString.
640: KSU.ShellInterpreter shellScript: 'open ~/Desktop/CodeSpaghetti.html'
641:
642: ------------------------------------------------------------
643:
644: SynapseInterpreter class method for 'examples - testing'
645:
646: example2ForTesting
647: "KSU.SynapseInterpreter example2ForTesting."
648:
649: | scriptString |
650: scriptString := '
651: /* Assignments */
652: unit = Value("minutes");
653: value = Value("10.5");
654: number2Time = Metrics("./path/to/Plugins/Number2Time");
655: transcript = Transcript();
656:
657: /* Synapses */
658: unit
659: to: number2Time.unit;
660: value
661: to: number2Time.value;
662: number2Time
663: to: transcript;
664: '.
665: KSU.SynapseInterpreter script: scriptString
666:
667: ------------------------------------------------------------
668:
669: SynapseInterpreter class method for 'examples - script'
670:
671: exampleAppendToFile
672: "KSU.SynapseInterpreter exampleAppendToFile."
673:
674: | scriptString |
675: scriptString := '
676: /* Assignments */
677: hogeString = Value("This is sample hoge string!!
678: append hogehoge.");
679: file = File("/Users/Miyazaki/Desktop/hogeWrite.txt", "append");
680: transcript = Transcript();
681:
682: /* Synapses */
683: hogeString
684: to: file;
685: hogeString
686: to: transcript;
687: '.
688: ^scriptString
689:
690: ------------------------------------------------------------
691:
692: SynapseInterpreter class method for 'examples - script'
693:
694: exampleCodeSpaghetti
695: "KSU.SynapseInterpreter exampleCodeSpaghetti."
696:
697: | scriptString |
698: scriptString := '
699: /*** Assignments ***/
700: sourceFile = File("/Users/Miyazaki/Desktop/source.c", "read");
701: htmlFile = File("/Users/Miyazaki/Desktop/Spaghetti.html", "write");
702: imageFilename = Value("/Users/Miyazaki/Desktop/Spaghetti.jpg");
703: fileCopy = Metrics("/Users/Miyazaki/Desktop/FileCopy");
704: easyMetrics = Metrics("/Users/Miyazaki/Desktop/C_EasyMetrics");
705: division = Metrics("/Users/Miyazaki/Desktop/Division2");
706: linesPerFunction2WaitTime
707: = Metrics("/Users/Miyazaki/Desktop/LinesPerFunction2WaitTime");
708: idLength2SpaghettiName
709: = Metrics("/Users/Miyazaki/Desktop/IdLength2SpaghettiName");
710: indentDifference2VariabilityOfBoilingTime
711: = Metrics("/Users/Miyazaki/Desktop/IndentDifference2VariabilityOfBoilingTime");
712: commentRatio2OliveOil
713: = Metrics("/Users/Miyazaki/Desktop/CommentRatio2OliveOil");
714: codeSpaghetti
715: = Metrics("/Users/Miyazaki/Desktop/CodeSpaghetti");
716: timeUnit = Value("minutes");
717: number2Time_1 = Metrics("/Users/Miyazaki/Desktop/Number2Time");
718: number2Time_2 = Metrics("/Users/Miyazaki/Desktop/Number2Time");
719:
720: /*** Synapses ***/
721: sourceFile
722: to: easyMetrics;
723: easyMetrics
724: send: effectiveLOC to: division.dividend
725: send: quotient to: linesPerFunction2WaitTime
726: to: number2Time_1.value
727: to: codeSpaghetti.waitTime;
728: easyMetrics
729: send: numberOfFunctions to: division.divisor;
730: easyMetrics
731: send: averageLengthOfId to: idLength2SpaghettiName
732: send: spaghettiName to: codeSpaghetti.spaghettiName;
733: easyMetrics
734: send: indentDifference to: indentDifference2VariabilityOfBoilingTime
735: to: number2Time_2.value
736: to: codeSpaghetti.variability;
737: easyMetrics
738: send: commentRatio to: commentRatio2OliveOil
739: to: codeSpaghetti.oliveOil;
740: idLength2SpaghettiName
741: send: spaghettiImage to: fileCopy.source;
742: imageFilename
743: to: fileCopy.destination;
744: imageFilename
745: to: codeSpaghetti.imageFile;
746: timeUnit
747: to: number2Time_1.unit;
748: timeUnit
749: to: number2Time_2.unit;
750: codeSpaghetti
751: to: htmlFile;
752: '.
753: ^scriptString
754:
755: ------------------------------------------------------------
756:
757: SynapseInterpreter class method for 'examples - startup'
758:
759: exampleCodeSpaghettiForStartup
760: "KSU.SynapseInterpreter exampleCodeSpaghettiForStartup."
761:
762: | aFilename scriptString |
763: aFilename := Filename defaultDirectory construct: './path/to/Results/CodeSpaghetti.jpg'.
764: scriptString := '
765: /*** Assignments ***/
766: sourceFile = File("./path/to/Programs/source.c", "read");
767: htmlFile = File("./path/to/Results/CodeSpaghetti.html", "write");
768: imageFilename = Value("'
769: , aFilename asString
770: , '");
771: fileCopy = Metrics("./path/to/Plugins/FileCopy");
772: easyMetrics = Metrics("./path/to/Plugins/C_EasyMetrics");
773: division = Metrics("./path/to/Plugins/Division2");
774: lpf2WaitTime = Metrics("./path/to/Plugins/LinesPerFunction2WaitTime");
775: id2Spaghetti = Metrics("./path/to/Plugins/IdLength2SpaghettiName");
776: indent2Variability = Metrics("./path/to/Plugins/IndentDifference2VariabilityOfBoilingTime");
777: comment2OliveOil = Metrics("./path/to/Plugins/CommentRatio2OliveOil");
778: codeSpaghetti = Metrics("./path/to/Plugins/CodeSpaghetti");
779: timeUnit = Value("minutes");
780: number2Time_1 = Metrics("./path/to/Plugins/Number2Time");
781: number2Time_2 = Metrics("./path/to/Plugins/Number2Time");
782:
783: /*** Synapses ***/
784: sourceFile
785: to: easyMetrics;
786: easyMetrics
787: send: effectiveLOC to: division.dividend
788: send: quotient to: lpf2WaitTime
789: to: number2Time_1.value
790: to: codeSpaghetti.waitTime;
791: easyMetrics
792: send: numberOfFunctions to: division.divisor;
793: easyMetrics
794: send: averageLengthOfId to: id2Spaghetti
795: send: spaghettiName to: codeSpaghetti.spaghettiName;
796: easyMetrics
797: send: indentDifference to: indent2Variability
798: to: number2Time_2.value
799: to: codeSpaghetti.variability;
800: easyMetrics
801: send: commentRatio to: comment2OliveOil
802: to: codeSpaghetti.oliveOil;
803: id2Spaghetti
804: send: spaghettiImage to: fileCopy.source;
805: imageFilename
806: to: fileCopy.destination;
807: imageFilename
808: to: codeSpaghetti.imageFile;
809: timeUnit
810: to: number2Time_1.unit;
811: timeUnit
812: to: number2Time_2.unit;
813: codeSpaghetti
814: to: htmlFile;
815: '.
816: KSU.SynapseInterpreter script: scriptString.
817: KSU.ShellInterpreter shellScript: 'open ./path/to/Results/CodeSpaghetti.html'.
818: ^scriptString
819:
820: ------------------------------------------------------------
821:
822: SynapseInterpreter class method for 'examples - testing'
823:
824: exampleCodeSpaghettiForTesting
825: "KSU.SynapseInterpreter exampleCodeSpaghettiForTesting."
826:
827: | scriptString |
828: scriptString := '
829: /*** Assignments ***/
830: sourceFile = File("./path/to/Programs/source.c", "read");
831: htmlFile = File("/Users/Miyazaki/Desktop/CodeSpaghetti.html", "write");
832: imageFilename = Value("/Users/Miyazaki/Desktop/CodeSpaghetti.jpg");
833: fileCopy = Metrics("./path/to/Plugins/FileCopy");
834: easyMetrics = Metrics("./path/to/Plugins/C_EasyMetrics");
835: division = Metrics("./path/to/Plugins/Division2");
836: lpf2WaitTime = Metrics("./path/to/Plugins/LinesPerFunction2WaitTime");
837: id2Spaghetti = Metrics("./path/to/Plugins/IdLength2SpaghettiName");
838: indent2Variability = Metrics("./path/to/Plugins/IndentDifference2VariabilityOfBoilingTime");
839: comment2OliveOil = Metrics("./path/to/Plugins/CommentRatio2OliveOil");
840: codeSpaghetti = Metrics("./path/to/Plugins/CodeSpaghetti");
841: timeUnit = Value("minutes");
842: number2Time_1 = Metrics("./path/to/Plugins/Number2Time");
843: number2Time_2 = Metrics("./path/to/Plugins/Number2Time");
844:
845: /*** Synapses ***/
846: sourceFile
847: to: easyMetrics;
848: easyMetrics
849: send: effectiveLOC to: division.dividend
850: send: quotient to: lpf2WaitTime
851: to: number2Time_1.value
852: to: codeSpaghetti.waitTime;
853: easyMetrics
854: send: numberOfFunctions to: division.divisor;
855: easyMetrics
856: send: averageLengthOfId to: id2Spaghetti
857: send: spaghettiName to: codeSpaghetti.spaghettiName;
858: easyMetrics
859: send: indentDifference to: indent2Variability
860: to: number2Time_2.value
861: to: codeSpaghetti.variability;
862: easyMetrics
863: send: commentRatio to: comment2OliveOil
864: to: codeSpaghetti.oliveOil;
865: id2Spaghetti
866: send: spaghettiImage to: fileCopy.source;
867: imageFilename
868: to: fileCopy.destination;
869: imageFilename
870: to: codeSpaghetti.imageFile;
871: timeUnit
872: to: number2Time_1.unit;
873: timeUnit
874: to: number2Time_2.unit;
875: codeSpaghetti
876: to: htmlFile;
877: '.
878: ^scriptString
879:
880: ------------------------------------------------------------
881:
882: SynapseInterpreter class method for 'examples - testing'
883:
884: exampleCodeSpaghettiForTesting2
885: "KSU.SynapseInterpreter exampleCodeSpaghettiForTesting2."
886:
887: | scriptString |
888: scriptString := '
889: /*** Assignments ***/
890: sourceFile = File("/Users/Miyazaki/Desktop/source.c", "read");
891: htmlFile = File("/Users/Miyazaki/Desktop/CodeSpaghetti.html", "write");
892: imageFilename = Value("/Users/Miyazaki/Desktop/CodeSpaghetti.jpg");
893: fileCopy = Metrics("./path/to/Plugins/FileCopy");
894: easyMetrics = Metrics("./path/to/Plugins/C_EasyMetrics");
895: division = Metrics("./path/to/Plugins/Division2");
896: lpf2WaitTime = Metrics("./path/to/Plugins/LinesPerFunction2WaitTime");
897: id2Spaghetti = Metrics("./path/to/Plugins/IdLength2SpaghettiName");
898: indent2Variability = Metrics("./path/to/Plugins/IndentDifference2VariabilityOfBoilingTime");
899: comment2OliveOil = Metrics("./path/to/Plugins/CommentRatio2OliveOil");
900: codeSpaghetti = Metrics("./path/to/Plugins/CodeSpaghetti");
901: timeUnit = Value("minutes");
902: number2Time_1 = Metrics("./path/to/Plugins/Number2Time");
903: number2Time_2 = Metrics("./path/to/Plugins/Number2Time");
904:
905: /*** Synapses ***/
906: sourceFile
907: to: easyMetrics;
908: easyMetrics
909: send: effectiveLOC to: division.dividend
910: send: quotient to: lpf2WaitTime
911: to: number2Time_1.value
912: to: codeSpaghetti.waitTime;
913: easyMetrics
914: send: numberOfFunctions to: division.divisor;
915: easyMetrics
916: send: averageLengthOfId to: id2Spaghetti
917: send: spaghettiName to: codeSpaghetti.spaghettiName;
918: easyMetrics
919: send: indentDifference to: indent2Variability
920: to: number2Time_2.value
921: to: codeSpaghetti.variability;
922: easyMetrics
923: send: commentRatio to: comment2OliveOil
924: to: codeSpaghetti.oliveOil;
925: id2Spaghetti
926: send: spaghettiImage to: fileCopy.source;
927: imageFilename
928: to: fileCopy.destination;
929: imageFilename
930: to: codeSpaghetti.imageFile;
931: timeUnit
932: to: number2Time_1.unit;
933: timeUnit
934: to: number2Time_2.unit;
935: codeSpaghetti
936: to: htmlFile;
937: '.
938: KSU.SynapseInterpreter script: scriptString.
939: KSU.ShellInterpreter shellScript: 'open ~/Desktop/CodeSpaghetti.html'.
940: ^scriptString
941:
942: ------------------------------------------------------------
943:
944: SynapseInterpreter class method for 'examples - script'
945:
946: exampleEcho
947: "KSU.SynapseInterpreter exampleEcho."
948:
949: | aStream scriptString |
950: aStream := (String new writeStream)
951: nextPutAll: '/* Assignments */';
952: nextPutAll: 'value = Value("You executed ''exampleEcho'' on ';
953: nextPutAll: Date today printString;
954: nextPutAll: ' ';
955: nextPutAll: Time now printString;
956: nextPutAll: '");';
957: nextPutAll: 'echo = Metrics("/Users/Miyazaki/Desktop/Echo");';
958: nextPutAll: 'transcript = Transcript();';
959: nextPutAll: '/* Synapses */';
960: nextPutAll: 'value';
961: nextPutAll: ' to: echo;';
962: nextPutAll: 'echo';
963: nextPutAll: ' to: transcript;';
964: nextPutAll: 'echo';
965: nextPutAll: ' to: transcript;';
966: nextPutAll: 'echo';
967: nextPutAll: ' to: transcript;';
968: yourself.
969: scriptString := aStream contents.
970: ^scriptString
971:
972: ------------------------------------------------------------
973:
974: SynapseInterpreter class method for 'examples - script'
975:
976: exampleEcho2
977: "KSU.SynapseInterpreter exampleEcho2."
978:
979: | aStream scriptString |
980: aStream := (String new writeStream)
981: nextPutAll: '/* Assignments */';
982: nextPutAll: 'sourceFile = File("/Users/Miyazaki/Desktop/main2.c", "read");';
983: nextPutAll: 'echo = Metrics("/Users/Miyazaki/Desktop/Echo2");';
984: nextPutAll: 'transcript = Transcript();';
985: nextPutAll: '/* Synapses */';
986: nextPutAll: 'sourceFile';
987: nextPutAll: ' to: echo';
988: nextPutAll: ' to: transcript;';
989: yourself.
990: scriptString := aStream contents.
991: ^scriptString
992:
993: ------------------------------------------------------------
994:
995: SynapseInterpreter class method for 'examples - script'
996:
997: exampleEcho3
998: "KSU.SynapseInterpreter exampleEcho3."
999:
1000: | aStream scriptString |
1001: aStream := (String new writeStream)
1002: nextPutAll: '/* Assignments */';
1003: nextPutAll: 'sourceFile = File("/Users/Miyazaki/Desktop/main2.c", "read");';
1004: nextPutAll: 'echo1 = Metrics("/Users/Miyazaki/Desktop/Echo2");';
1005: nextPutAll: 'echo2 = Metrics("/Users/Miyazaki/Desktop/Echo2");';
1006: nextPutAll: 'echo3 = Metrics("/Users/Miyazaki/Desktop/Echo2");';
1007: nextPutAll: 'echo4 = Metrics("/Users/Miyazaki/Desktop/Echo2");';
1008: nextPutAll: 'transcript = Transcript();';
1009: nextPutAll: '/* Synapses */';
1010: nextPutAll: 'sourceFile';
1011: nextPutAll: ' to: echo1';
1012: nextPutAll: ' to: echo2';
1013: nextPutAll: ' to: echo3';
1014: nextPutAll: ' to: echo4';
1015: nextPutAll: ' to: transcript;';
1016: yourself.
1017: scriptString := aStream contents.
1018: ^scriptString
1019:
1020: ------------------------------------------------------------
1021:
1022: SynapseInterpreter class method for 'examples - script'
1023:
1024: exampleForGettingInputOutputSymbols
1025: "KSU.SynapseInterpreter exampleForGettingInputOutputSymbols."
1026:
1027: | scriptString |
1028: scriptString := '
1029: /* Assignments */
1030: value = Value("This is sample string in ''exampleForGettingInputOutputSymbols''.");
1031: echo = Metrics("/Users/Miyazaki/Desktop/Echo");
1032: transcript = Transcript();
1033:
1034: /* Synapses */
1035: value
1036: to: echo
1037: to: transcript;
1038: '.
1039: ^scriptString
1040:
1041: ------------------------------------------------------------
1042:
1043: SynapseInterpreter class method for 'examples - script'
1044:
1045: exampleHoge
1046: "KSU.SynapseInterpreter exampleHoge."
1047:
1048: | scriptString |
1049: scriptString := '
1050: /* Assignments */
1051: sourceCode = Value("hoge.hogehogehoge. hoge,hogehoge. (hoge)*(hoge)/(hoge+hoge-hoge).");
1052: hogeMetrics = Metrics("/path/to/HogeMetrics");
1053: transcript = Transcript();
1054:
1055: /* Synapses */
1056: sourceCode
1057: to: hogeMetrics
1058: to: transcript;
1059: '.
1060: ^scriptString
1061:
1062: ------------------------------------------------------------
1063:
1064: SynapseInterpreter class method for 'examples - script'
1065:
1066: exampleInvalidFileOperation
1067: "KSU.SynapseInterpreter exampleInvalidFileOperation."
1068:
1069: | scriptString |
1070: scriptString := '
1071: /* Assignments */
1072: hogeString = Value("This paragraph has no mean.");
1073: file = File("/Users/Miyazaki/Desktop/hogeWrite.txt", "hogehogehoge");
1074: transcript = Transcript();
1075:
1076: /* Synapses */
1077: hogeString
1078: to: file;
1079: hogeString
1080: to: transcript;
1081: '.
1082: ^scriptString
1083:
1084: ------------------------------------------------------------
1085:
1086: SynapseInterpreter class method for 'examples - script'
1087:
1088: exampleMetrics1
1089: "KSU.SynapseInterpreter exampleMetrics1."
1090:
1091: | scriptString |
1092: scriptString := '
1093: /* Assignments */
1094: sourceFile = File("/path/to/source.c");
1095: numberOfMethods = Metrics("/path/to/NOM");
1096: transcript = Transcript();
1097:
1098: /* Synapses */
1099: sourceFile
1100: to: numberOfMethods
1101: to: transcript;
1102: '.
1103: ^scriptString
1104:
1105: ------------------------------------------------------------
1106:
1107: SynapseInterpreter class method for 'examples - script'
1108:
1109: exampleMetrics2
1110: "KSU.SynapseInterpreter exampleMetrics2."
1111:
1112: | scriptString |
1113: scriptString := '
1114: /* Assignments */
1115: sourceFile = File("/path/to/source.c");
1116: numberOfMethods = Metrics("/path/to/NOM");
1117: transcript = Transcript();
1118:
1119: /* Synapses */
1120: sourceFile
1121: send: output to: numberOfMethods.input
1122: send: output to: transcript.input;
1123: '.
1124: ^scriptString
1125:
1126: ------------------------------------------------------------
1127:
1128: SynapseInterpreter class method for 'examples - script'
1129:
1130: exampleMetrics3
1131: "KSU.SynapseInterpreter exampleMetrics3."
1132:
1133: | scriptString |
1134: scriptString := '
1135: /* Assignments */
1136: sourceFile = File("/Users/Miyazaki/Desktop/main2.c", "read");
1137: metrics = Metrics("/Users/Miyazaki/Desktop/C_EasyMetrics");
1138: transcript = Transcript();
1139:
1140: /* Synapses */
1141: sourceFile
1142: to: metrics
1143: send: linesOfCode to: transcript;
1144: '.
1145: ^scriptString
1146:
1147: ------------------------------------------------------------
1148:
1149: SynapseInterpreter class method for 'examples - script'
1150:
1151: exampleMetrics4
1152: "KSU.SynapseInterpreter exampleMetrics4."
1153:
1154: | scriptString |
1155: scriptString := '
1156: /* Assignments */
1157: sourceCode = Value("
1158: #include <stdio.h>
1159: #include <stdlib.h>
1160: int main(int argumentCount, char* argumentValues[])
1161: {
1162: int aValue;
1163: aValue = 3 + 4; // Smalltalker knows this mean...
1164: printf(""aValue is %d\n"", aValue);
1165: return EXIT_SUCCESS; // The ''EXIT_SUCCESS''requires ''stdlib.h''.
1166: }
1167: void error()
1168: {
1169: return;
1170: }
1171: ");
1172: metrics = Metrics("/Users/Miyazaki/Desktop/C_EasyMetrics");
1173: transcript = Transcript();
1174:
1175: /* Synapses */
1176: sourceCode
1177: to: metrics
1178: send: commentRatio to: transcript;
1179: '.
1180: ^scriptString
1181:
1182: ------------------------------------------------------------
1183:
1184: SynapseInterpreter class method for 'examples - script'
1185:
1186: exampleMetricsTable
1187: "KSU.SynapseInterpreter exampleMetricsTable."
1188:
1189: | scriptString |
1190: scriptString := '
1191: /*** Assignments ***/
1192: sourceFile = File("/Users/Miyazaki/Desktop/source.c", "read");
1193: htmlFile = File("/Users/Miyazaki/Desktop/MetricsTable.html", "write");
1194: easyMetrics = Metrics("/Users/Miyazaki/Desktop/C_EasyMetrics");
1195: division = Metrics("/Users/Miyazaki/Desktop/Division2");
1196: linesPerFunction2WaitTime
1197: = Metrics("/Users/Miyazaki/Desktop/LinesPerFunction2WaitTime");
1198: idLength2SpaghettiName
1199: = Metrics("/Users/Miyazaki/Desktop/IdLength2SpaghettiName");
1200: indentDifference2VariabilityOfBoilingTime
1201: = Metrics("/Users/Miyazaki/Desktop/IndentDifference2VariabilityOfBoilingTime");
1202: commentRatio2Degradation
1203: = Metrics("/Users/Miyazaki/Desktop/CommentRatio2Degradation");
1204: commentRatio2OliveOil
1205: = Metrics("/Users/Miyazaki/Desktop/CommentRatio2OliveOil");
1206: metricsTable
1207: = Metrics("/Users/Miyazaki/Desktop/MetricsTable");
1208: timeUnit = Value("minutes");
1209: number2Time_1 = Metrics("/Users/Miyazaki/Desktop/Number2Time");
1210: number2Time_2 = Metrics("/Users/Miyazaki/Desktop/Number2Time");
1211:
1212: /*** Synapses ***/
1213: sourceFile
1214: to: easyMetrics;
1215: easyMetrics.linesOfCode to: metricsTable.linesOfCode;
1216: easyMetrics.effectiveLOC to: metricsTable.effectiveLOC;
1217: easyMetrics.physicalLOC to: metricsTable.physicalLOC;
1218: easyMetrics.logicalLOC to: metricsTable.logicalLOC;
1219: easyMetrics.commentLines to: metricsTable.commentLines;
1220: easyMetrics.numberOfFunctions to: metricsTable.numberOfFunctions;
1221: easyMetrics.averageLengthOfId to: metricsTable.averageLengthOfId;
1222: easyMetrics.indentDifference to: metricsTable.indentDifference;
1223: easyMetrics.standardIndent to: metricsTable.standardIndent;
1224: easyMetrics.commentRatio to: metricsTable.commentRatio;
1225: easyMetrics
1226: send: effectiveLOC to: division.dividend
1227: send: quotient to: linesPerFunction2WaitTime
1228: to: number2Time_1.value
1229: to: metricsTable.waitTime;
1230: easyMetrics
1231: send: numberOfFunctions to: division.divisor;
1232: division
1233: send: quotient to: metricsTable.linesPerFunction;
1234: easyMetrics
1235: send: averageLengthOfId to: idLength2SpaghettiName
1236: send: spaghettiName to: metricsTable.spaghettiName;
1237: easyMetrics
1238: send: indentDifference to: indentDifference2VariabilityOfBoilingTime
1239: to: number2Time_2.value
1240: to: metricsTable.variability;
1241: easyMetrics
1242: send: commentRatio to: commentRatio2Degradation
1243: to: metricsTable.degradation;
1244: easyMetrics
1245: send: commentRatio to: commentRatio2OliveOil
1246: to: metricsTable.oliveOil;
1247: timeUnit
1248: to: number2Time_1.unit;
1249: timeUnit
1250: to: number2Time_2.unit;
1251: metricsTable
1252: to: htmlFile;
1253: '.
1254: ^scriptString
1255:
1256: ------------------------------------------------------------
1257:
1258: SynapseInterpreter class method for 'examples - script'
1259:
1260: exampleReadFromFile
1261: "KSU.SynapseInterpreter exampleReadFromFile."
1262:
1263: | scriptString |
1264: scriptString := '
1265: /* Assignments */
1266: file = File("/Users/Miyazaki/Desktop/hoge.txt", "read");
1267: transcript = Transcript();
1268:
1269: /* Synapses */
1270: file
1271: to: transcript;
1272: '.
1273: ^scriptString
1274:
1275: ------------------------------------------------------------
1276:
1277: SynapseInterpreter class method for 'examples - script'
1278:
1279: exampleSimpleHoge
1280: "KSU.SynapseInterpreter exampleSimpleHoge."
1281:
1282: | scriptString |
1283: scriptString := '
1284: /* Assignments */
1285: hogeString = Value("hoge.hogehogehoge. ""hoge,hogehoge."" (hoge)*(hoge)/(hoge+hoge-hoge).");
1286: transcript = Transcript();
1287:
1288: /* Synapses */
1289: hogeString
1290: to: transcript;
1291: '.
1292: ^scriptString
1293:
1294: ------------------------------------------------------------
1295:
1296: SynapseInterpreter class method for 'examples - script'
1297:
1298: exampleWriteToFile
1299: "KSU.SynapseInterpreter exampleWriteToFile."
1300:
1301: | scriptString |
1302: scriptString := '
1303: /* Assignments */
1304: hogeString = Value("This is sample hoge string!!
1305: hogehoge.");
1306: file = File("/Users/Miyazaki/Desktop/hogeWrite.txt", "write");
1307: transcript = Transcript();
1308:
1309: /* Synapses */
1310: hogeString
1311: to: file;
1312: hogeString
1313: to: transcript;
1314: '.
1315: ^scriptString
1316:
1317: ------------------------------------------------------------
1318:
1319: SynapseInterpreter class method for 'instance creation'
1320:
1321: new
1322:
1323: ^(super new)
1324: initialize;
1325: yourself
1326:
1327: ------------------------------------------------------------
1328:
1329: SynapseInterpreter class method for 'execution'
1330:
1331: script: scriptString
1332:
1333: | anInterpreter |
1334: anInterpreter := (self new)
1335: evaluate: scriptString;
1336: yourself.
1337: ^anInterpreter execute
1338:
1339: ================================================================================
This document was generated by KSU.TextDoclet on 2013/02/22 at 01:01:17.