All pastes #829126 Raw Edit

Untitled

public text v1 · immutable
#829126 ·published 2007-12-22 22:55 UTC
rendered paste body
// ===============================================================================================================================
// allen_interpreter.h - Allen Programming Language - Sat Dec 22.
// ===============================================================================================================================
// Copyright (c) 2007, Soleil, BSD License. 
//
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without modification, 
// are permitted provided that the following conditions are met:
//
//  * Redistributions of source code must retain the above copyright notice, 
//    this list of conditions and the following disclaimer.
//  * Redistributions in binary form must reproduce the above copyright notice, 
//    this list of conditions and the following disclaimer in the documentation 
//    and/or other materials provided with the distribution.
//  * Neither the name of the Garabatos de licor nor the names of its contributors may 
//    be used to endorse or promote products derived from this software 
//    without specific prior written permission.
//
// This software is provided by the copyright holders and contributors
// "as is" and any express or implied warranties, including, but not
// limited to, the implied warranties of merchantability and fitness for
// a particular purpose are disclaimed. in no event shall the copyright owner or
// contributors be liable for any direct, indirect, incidental, special,
// exemplary, or consequential damages (including, but not limited to,
// procurement of substitute goods or services; loss of use, data, or
// profits; or business interruption) however caused and on any theory of
// liability, whether in contract, strict liability, or tort (including
// negligence or otherwise) arising in any way out of the use of this
// software, even if advised of the possibility of such damage.

// ===============================================================================================================================
// Allen virtual machine.
// ===============================================================================================================================

// AllenVM is fairly simple. The virtual machine model is handled by different states
// that define what or how it behaves while running the current program. So far those
// states allow feedback of userlevel functions and actions and provide ways to
// extend the states accordingly.

// VM States.
enum {
 AllenVM_BREAK,    // Stop execution.
 AllenVM_CONTINUE, // Continue execution.
 AllenVM_ERROR,    // Error detected.
 AllenVM_SUCCESS,  // Everything ok.
 AllenVM_RETURN,   // Return value.
};

// ===============================================================================================================================
// Allen virtual machine errors.
// ===============================================================================================================================

// Sometimes during execution, Allen programs throw errors or exceptions to the user.
// As far as the VM goes, programs should never segfault, so safety is ensured and 
// any error causes program termination.

#define VM_ERROR_FUNC_FOUND     "Error: Function:'%s' already defined."
#define VM_ERROR_FUNC_NOTFOUND  "Error: Function:'%s' undefined in current scope."
#define VM_ERROR_SVAR_NOTFOUND  "Error: Single: '%s' undefined in current scope."

// ===============================================================================================================================
// Allen internal structures.
// ===============================================================================================================================

// AllenVM is structured in a very simple (but efective) way. All functions, single 
// variables, objects and instances are handled by linked lists, beeing easily 
// identified and accesible through program execution.

// There is no compilation stage, nor bytecode translation or code generation.
// Everything is executed on the fly using function pointers. This also allows
// for more dynamic implementations and code traversing. Higher order functions,
// functional programming and other tasks.

// Allen interpreter.
// As you can run different interpreters at the same time, this is the main
// structure defining the interpreter itself.

struct AllenVM_Interpreter {
 int i_Ident;                           // Interpreter identifier.
 int i_Level;                           // Current level of execution.
 char* c_result;                        // Last function result.
 struct AllenVM_Function *st_Function;  // Local functions.
 struct AllenVM_Scope *st_Scope;        // Interpreter scope.
};

// Allen single variable.
// Single vars, wether integers, strings, characters, objects or macros are 
// all handled by the same linked list. We store the name and the value
// and link it to the next single variable.

struct AllenVM_Single {      
 char *c_Name;                          // Variable name.
 char *c_Value;                         // Variable value.
 struct AllenVM_Single *st_Next;        // Link to the next single var in the list.
};

// Allen native C calls. 
// Every Allen standard function is mapped to a C native function, so you can 
// extend the interpreter using C itself as well as using Allen itself.

typedef int (*AllenVM_NativeCall) (struct AllenVM_Interpreter *i, int argc, char **argv, void *data);

// Allen Function.
// Every single sentence in Allen programs is a function. And every single
// sentence returns a value. So we need to store functions and be able to traverse
// them looking for the native C call that they execute. We handle user-defined functions
// by asigning private data to this structure, but that is clearer in the function library.

struct AllenVM_Function {
 char *c_Name;                          // Function name.
 void *v_Data;                          // Private data used by the function.
 AllenVM_NativeCall Function;           // Native C call that this function may use.
 struct AllenVM_Function *st_Next;      // Link to the next function in the list.
};

// Allen Scopes.
// Scopes are the way we define global and local variables in our programs. 
// Each scope defines two structures. One stores all the variables in our current
// scope, while the other is just a handler to be able to return to the parent
// scope after a function call.

struct AllenVM_Scope {
 struct AllenVM_Single *st_Single;      // Single variables in this scope.
 struct AllenVM_Scope *st_Parent;       // Parent scope that called this one.
};

// ===============================================================================================================================
// EOF
// ===============================================================================================================================
// Compiling this file: Gcc -O2 -lm 
// Recommended code editor: Scite/Gedit/Vim.