home *** CD-ROM | disk | FTP | other *** search
- /*
- Copyright (C) 1994 Sean Luke
-
- COWSInterpreter.h
- Version 1.0
- Sean Luke
-
- */
-
-
-
-
-
-
- #import <objc/Object.h>
- #import <appkit/appkit.h> // for timed entry
- #import <objc/HashTable.h>
- #import <string.h>
- #import <stdio.h>
- #import <stdlib.h>
- #import "COWSLibrary.h"
- #import "COWSStack.h"
- #import "COWSArgumentList.h"
- #import "COWSNode.h"
- #import "COWSStringNode.h"
- #import "COWSSymbolNode.h"
- #import "COWSLibraryFunctionNode.h"
- #import "COWSStateNode.h"
- #import "COWSProtocols.h"
-
-
-
- // Types of interpretation
- #define COWSINTERPRETATIONUNDEFINED 0
- #define COWSINTERPRETATIONLIBRARY 1 // a library function was requested
- #define COWSINTERPRETATIONFUNCTION 2 // a user's program was requested
-
- // Limits
- #define COWSLARGENUMBER 256 // the longest valid string length for a number
- // I define this because sprintf requires an
- // array, and not just a character pointer.
- // I wish there was another way around this,
- // but I don't think so...
-
- // Success Marker
- #define COWSSUCCESS 0 // >=0 also means parse succeeded
-
- // Interpreter Bugs
- #define COWSINTERNALERROR -1 // bug in COWS
-
- // Initial Parse Errors
- #define COWSERRORNOMORETOKENS -2 // not enough tokens to parse
- #define COWSERRORSYNTAX -3 // syntax error
- #define COWSERRORNOCLOSINGQUOTE -4 // no closing quote to a string
- #define COWSERRORDUPLICATEGLOBAL -5 // duplicate global variable
- #define COWSERRORDUPLICATEVARIABLE -6 // duplicate variable or argument
- #define COWSERRORDUPLICATEARGUMENT -7 // duplicate argument
- #define COWSERRORDUPLICATEFUNCTION -18 // duplicate function
-
- // Interpreter Syntax Errors
- #define COWSERRORNOSUCHFUNCTION -8 // can't find function by that name
- #define COWSERRORNOTENOUGHARGUMENTS -9 // too few arguments to function
- #define COWSERRORTOOMANYARGUMENTS -10 // too many aguments to function
- #define COWSLIBRARYFUNCTIONERROR -11 // library function error
- #define COWSERRORNOSUCHVARIABLE -12 // can't find variable by that name
- // COWSERRORNOMORETOKENS // not enough tokens to parse
- #define COWSERRORNOFUNCTIONNAME -13 // no function/keyword name after (
-
- // Keyword Syntax Errors
- #define COWSERRORSETNOTVARIABLE -14 // can't set; not a variable
- #define COWSERRORSETTOOMANYVALUES -15 // can't set; too many values
- #define COWSERRORSETNOVALUE -16 // can't set; no value
- #define COWSERRORSETNOSUCHVARIABLE -17 // can't set; no such variable
- #define COWSERRORIFNOTHENCLAUSE -19 // can't if; no then clause
- #define COWSERRORIFTOOMANYVALUES -20 // can't if; too many values
- #define COWSERRORIFNOTENOUGHVALUES -21 // can't if; not enough values
- #define COWSERRORWHILETOOMANYVALUES -22 // can't while; too many values
- #define COWSERRORWHILENOTENOUGHVALUES -23 // can't while; not enough values
- #define COWSERRORFORNOTAVARIABLE -24 // can't for; not a variable
- #define COWSERRORFORSTARTNOTNUMBER -25 // can't for; start value not a #
- #define COWSERRORFORSTOPNOTNUMBER -26 // can't for; stop value not a #
- #define COWSERRORFORSTEPNOTNUMBER -27 // can't for; step value not a #
- #define COWSERRORFORNOSUCHVARIABLE -28 // can't for; no such variable
- #define COWSERRORFORTOOMANYVALUES -29 // can't for; too many values
- #define COWSERRORFORNOTENOUGHVALUES -30 // can't for; not enough values
-
- // convenience functions
-
- char* newstr(const char* ct);
- // strcpys ct into a new string, returning the new string's pointer.
-
- char* newstrn(const char*ct, int size);
- // strncpys ct into a new string, returning the new string's pointer.
-
-
-
- @interface COWSInterpreter:Object <InterpreterControl, LibraryControl>
- {
- COWSStringNode*
- program;
- BOOL running;
- BOOL function_completed;
- BOOL foreground; // default is NO
- BOOL locked; // cannot be used by another process
- BOOL working; // working on a task, paused or no.
- int repeats;
- id delegate;
- DPSTimedEntry
- teNum;
- float te_speed; // default 0.1
- COWSStack* stack;
- HashTable* function_dictionary;
- HashTable* library_dictionary;
- HashTable* global_dictionary;
- HashTable* current_dictionary;
- COWSStringNode*
- current_function;
- int current_position;
- id pausing_function;
- int interpretation; // when a user starts a request,
- // this is set to whether it's a macro
- // request or just a program function
- // request...
- }
-
- - init;
- - free;
- - addLibrary:this_library; // returns NULL if unable
- - addLibraryFunction:(const char*) this_name
- selector: (SEL) this_selector
- target: this_target;
- - clearLibraryFunctions;
- - setTimedEntrySpeed:(float)this_speed; // in seconds
- - (float) timedEntrySpeed;
- - setForeground:(BOOL) yes_or_no;
- - (BOOL) foreground;
- - setLocked:(BOOL) yes_or_no;
- - (BOOL) locked;
- - (BOOL) working; // you can't change this
- - (BOOL) running; // you can't change this
- - (int) setProgram:(const char*) this_string;
- // parses through this_string and places pieces in various
- // dictionaries. Returns an error code.
- - printDictionaries;
- - printProgram;
- - setDelegate:this_delegate;
- - delegate;
- - setRepeats:(int) this_number;
- - (int) repeats;
- - interpretFunction:(const char*) this_name
- arguments:(COWSArgumentList*)these_arguments;
- // interprets function this_name with arguments these_arguments
- // it is your responbility to free these_arguments after calling
- // this function.
- // Returns the interpreter. Don't free the return value!!! :-)
- - stopInterpreting;
- - pauseInterpreting:calling_function;
- - resumeInterpretingWithValue:(COWSStringNode*)this_value;
-
-
- // Delegate Methods. Just Declared here...it's what's sent to you!
-
- - finishedInterpreting:(const char*)returnValue:(int)thisMessage:sender;
- - errorInterpreting:(int) thisError:(const char*)thisFunction:
- (int)thisPosition:(const char*)thisString:sender;
-
-
-
-
- // Tokenizer. Don't touch this.
-
- - (int) _tokenize:(const char*) string:(int) pos:(COWSStringNode*) token;
-
-
-
- // Recursive descent parser functions.
- // Don't touch these.
-
- - (int) _item:(const char*)string:(int)pos;
- - (int) _itemList:(const char*)string:(int)pos;
- - (int) _variableList:(const char*) string:(int)pos;
- - (int) _globalForm:(const char*)string:(int)pos;
- - (int) _argumentList:(const char*) string:(int)pos:
- (COWSArgumentList*) arguments;
- - (int) _localVariableList:(const char*) string:(int)pos:
- (HashTable*) arguments;
- - (int) _functionForm:(const char*)string:(int)pos;
- - (int) _programList:(const char*)string:(int)pos;
- - (int) _program:(const char*)string:(int)pos;
-
-
- // Recursive descent parser terminal functions.
- // Don't touch these.
-
- - (int) _symbolName:(const char*)string:(COWSStringNode*)s:(int)pos;
- - (int) _atom:(const char*)string:(int)pos;
- - (int) _beginKeyword:(const char*)string:(int)pos;
- - (int) _functionKeyword:(const char*)string:(int)pos;
- - (int) _variableKeyword:(const char*)string:(int)pos;
- - (int) _closeParen:(const char*)string:(int)pos;
- - (int) _openParen:(const char*)string:(int)pos;
-
-
-
- // Interpreter functions
- // Don't touch these.
-
- - _executeProgram:(COWSArgumentList*) arguments:(COWSStringNode*) symbol;
- - _performFunction;
- - _performInternalFunction:
- (COWSArgumentList*) arguments:(COWSStringNode*) symbol;
- - _performLibraryFunction:
- (COWSArgumentList*) arguments:(COWSStringNode*) symbol;
- - _completeFunction;
- - _evaluateVariable:(COWSStringNode*) symbol;
- - _doKeywords;
- - _go; // called by the timed entry
- - _readEval; // called by _go <repeats> number of times
-
-
- // Interpreter Keyword functions
- // Don't touch these.
-
- - _startSet;
- - _doSet;
- - _finishSet;
- - _startIf;
- - _doIf;
- - _finishIf;
- - _startWhile;
- - _doWhile;
- - _finishWhile;
- - _startFor;
- - _doFor;
- - _finishFor;
-
-
- // Interpreter assistance functions
- // Don't touch these.
-
- - (int) _skip; // skips one value if there is one. Returns error if not.
- - _makeTruth:(COWSStringNode*) string; // makes a truth a node string
- - _makeNumber:(COWSStringNode*) string; // makes a number a proper number.
- // bad numbers may wind up
- // different than expected or 0!
- - _strip:(COWSStringNode*) string; // strips strings of their "s
- - (int) _error:(int) this_error:
- (const char*) this_function:
- (int) this_position:
- (const char*) this_string; // reports an error.
-
- @end