This is COWSInterpreter.h in view mode; [Download] [Up]
/*
Copyright (C) 1994 Sean Luke
COWSInterpreter.h
Version 1.4
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 "COWSStack.h"
#import "COWSStringNode.h"
#import "COWSProtocols.h"
#import <appkit/NXImage.h> // for Interface Builder
// 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>
{
BOOL inited; // flag to make sure only inited once
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.
BOOL printing_errors; // default is YES
int repeats;
id tempDelegate; // a miscellaneous delegate to be
// used only by a current library
// or whatnot
id delegate; // the application's official delegate
DPSTimedEntry
teNum;
float te_speed; // default 0.1
COWSStack* stack;
COWSArgumentList* library_delegates;
HashTable* function_dictionary;
HashTable* library_dictionary;
HashTable* global_dictionary;
HashTable* current_dictionary;
COWSStringNode*
current_function;
int current_position;
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;
- awake; // calls init if not called already
- free;
- addLibrary:this_library; // returns NULL if unable
- addLibraryFunction:(const char*) this_name
selector: (SEL) this_selector
target: this_target;
- makeMeALibraryDelegate:sender;
- 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:sender;
- printProgram:sender;
- setTempDelegate:this_delegate;
- tempDelegate;
- 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;
- (BOOL) canPause;
- pauseInterpreting;
- resumeInterpreting;
- resumeInterpretingWithValue:(COWSStringNode*)this_value;
- printErrors:(BOOL) yes_or_no;
- (BOOL) printingErrors;
// 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
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.