From b3e278351a38c39db814735f2d96497941ed4cda Mon Sep 17 00:00:00 2001
From: David Walter Seikel
Date: Tue, 17 Jan 2012 11:17:00 +1000
Subject: Change how output and converting is done.

---
 LuaSL/src/LuaSL_LSL_tree.c | 262 +++++++++++++++++++++------------------------
 LuaSL/src/LuaSL_LSL_tree.h |  10 +-
 2 files changed, 129 insertions(+), 143 deletions(-)

(limited to 'LuaSL/src')

diff --git a/LuaSL/src/LuaSL_LSL_tree.c b/LuaSL/src/LuaSL_LSL_tree.c
index af6e02f..fb35490 100644
--- a/LuaSL/src/LuaSL_LSL_tree.c
+++ b/LuaSL/src/LuaSL_LSL_tree.c
@@ -9,124 +9,124 @@ static LSL_Leaf *evaluateNoToken(LSL_Leaf *content, LSL_Leaf *left, LSL_Leaf *ri
 static LSL_Leaf *evaluateOperationToken(LSL_Leaf  *content, LSL_Leaf *left, LSL_Leaf *right);
 static LSL_Leaf *eveluateParenthesisToken(LSL_Leaf *content, LSL_Leaf *left, LSL_Leaf *right);
 static LSL_Leaf *evaluateStatementToken(LSL_Leaf *content, LSL_Leaf *left, LSL_Leaf *right);
-static void outputFloatToken(FILE *file, LSL_Leaf *content);
-static void outputFunctionToken(FILE *file, LSL_Leaf *content);
-static void outputIntegerToken(FILE *file, LSL_Leaf *content);
-static void outputParameterToken(FILE *file, LSL_Leaf *content);
-static void outputParameterListToken(FILE *file, LSL_Leaf *content);
-static void outputParenthesisToken(FILE *file, LSL_Leaf *content);
-static void outputStateToken(FILE *file, LSL_Leaf *content);
-static void outputStatementToken(FILE *file, LSL_Leaf *content);
-static void outputVariableToken(FILE *file, LSL_Leaf *content);
+static void outputFloatToken(FILE *file, outputMode mode, LSL_Leaf *content);
+static void outputFunctionToken(FILE *file, outputMode mode, LSL_Leaf *content);
+static void outputIntegerToken(FILE *file, outputMode mode, LSL_Leaf *content);
+static void outputParameterToken(FILE *file, outputMode mode, LSL_Leaf *content);
+static void outputParameterListToken(FILE *file, outputMode mode, LSL_Leaf *content);
+static void outputParenthesisToken(FILE *file, outputMode mode, LSL_Leaf *content);
+static void outputStateToken(FILE *file, outputMode mode, LSL_Leaf *content);
+static void outputStatementToken(FILE *file, outputMode mode, LSL_Leaf *content);
+static void outputVariableToken(FILE *file, outputMode mode, LSL_Leaf *content);
 
 LSL_Token LSL_Tokens[] =
 {
     // Various forms of "space".
-    {LSL_COMMENT,		ST_NONE,		"/*",	LSL_NONE,				NULL, NULL, NULL},
-    {LSL_COMMENT_LINE,		ST_NONE,		"//",	LSL_NONE,				NULL, NULL, NULL},
-    {LSL_SPACE,			ST_NONE,		" ",	LSL_NONE,				NULL, NULL, NULL},
+    {LSL_COMMENT,		ST_NONE,		"/*",	LSL_NONE,				NULL, NULL},
+    {LSL_COMMENT_LINE,		ST_NONE,		"//",	LSL_NONE,				NULL, NULL},
+    {LSL_SPACE,			ST_NONE,		" ",	LSL_NONE,				NULL, NULL},
 
     // Operators, in order of precedence, low to high
     // Left to right, unless otherwise stated.
     // According to http://wiki.secondlife.com/wiki/Category:LSL_Operators
-    {LSL_BOOL_AND,		ST_BOOLEAN,		"&&",	LSL_RIGHT2LEFT,				NULL, NULL, evaluateOperationToken},
+    {LSL_BOOL_AND,		ST_BOOLEAN,		"&&",	LSL_RIGHT2LEFT,				NULL, evaluateOperationToken},
 // QUIRK - Seems to be some disagreement about BOOL_AND/BOOL_OR precedence.  Either they are equal, or OR is higher.
 // QUIRK - No boolean short circuiting.
 // QUIRK - Booleans and conditionals are executed right to left.  Or maybe not, depending on who you believe.
-    {LSL_BOOL_OR,		ST_BOOLEAN,		"||",	LSL_RIGHT2LEFT,				NULL, NULL, evaluateOperationToken},
-    {LSL_BIT_OR,		ST_BITWISE,		"|",	LSL_LEFT2RIGHT,				NULL, NULL, evaluateOperationToken},
-    {LSL_BIT_XOR,		ST_BITWISE,		"^",	LSL_LEFT2RIGHT,				NULL, NULL, evaluateOperationToken},
-    {LSL_BIT_AND,		ST_BITWISE,		"&",	LSL_LEFT2RIGHT,				NULL, NULL, evaluateOperationToken},
+    {LSL_BOOL_OR,		ST_BOOLEAN,		"||",	LSL_RIGHT2LEFT,				NULL, evaluateOperationToken},
+    {LSL_BIT_OR,		ST_BITWISE,		"|",	LSL_LEFT2RIGHT,				NULL, evaluateOperationToken},
+    {LSL_BIT_XOR,		ST_BITWISE,		"^",	LSL_LEFT2RIGHT,				NULL, evaluateOperationToken},
+    {LSL_BIT_AND,		ST_BITWISE,		"&",	LSL_LEFT2RIGHT,				NULL, evaluateOperationToken},
 // QUIRK - Booleans and conditionals are executed right to left.  Or maybe not, depending on who you believe.
-    {LSL_NOT_EQUAL,		ST_EQUALITY,		"!=",	LSL_RIGHT2LEFT,				NULL, NULL, evaluateOperationToken},
-    {LSL_EQUAL,			ST_EQUALITY,		"==",	LSL_RIGHT2LEFT,				NULL, NULL, evaluateOperationToken},
-    {LSL_GREATER_EQUAL,		ST_COMPARISON,		">=",	LSL_RIGHT2LEFT,				NULL, NULL, evaluateOperationToken},
-    {LSL_LESS_EQUAL,		ST_COMPARISON,		"<=",	LSL_RIGHT2LEFT,				NULL, NULL, evaluateOperationToken},
-    {LSL_GREATER_THAN,		ST_COMPARISON,		">",	LSL_RIGHT2LEFT,				NULL, NULL, evaluateOperationToken},
-    {LSL_LESS_THAN,		ST_COMPARISON,		"<",	LSL_RIGHT2LEFT,				NULL, NULL, evaluateOperationToken},
-    {LSL_RIGHT_SHIFT,		ST_BITWISE,		">>",	LSL_LEFT2RIGHT,				NULL, NULL, evaluateOperationToken},
-    {LSL_LEFT_SHIFT,		ST_BITWISE,		"<<",	LSL_LEFT2RIGHT,				NULL, NULL, evaluateOperationToken},
-    {LSL_CONCATENATE,		ST_ADD,			"+",	LSL_LEFT2RIGHT,				NULL, NULL, evaluateOperationToken},
-    {LSL_ADD,			ST_ADD,			"+",	LSL_LEFT2RIGHT,				NULL, NULL, evaluateOperationToken},
-    {LSL_SUBTRACT,		ST_SUBTRACT,		"-",	LSL_LEFT2RIGHT,				NULL, NULL, evaluateOperationToken},
-    {LSL_CROSS_PRODUCT,		ST_NONE,		"%",	LSL_LEFT2RIGHT,				NULL, NULL, evaluateOperationToken},
-    {LSL_DOT_PRODUCT,		ST_NONE,		"*",	LSL_LEFT2RIGHT,				NULL, NULL, evaluateOperationToken},
-    {LSL_MULTIPLY,		ST_MULTIPLY,		"*",	LSL_LEFT2RIGHT,				NULL, NULL, evaluateOperationToken},
-    {LSL_MODULO,		ST_MODULO,		"%",	LSL_LEFT2RIGHT,				NULL, NULL, evaluateOperationToken},
-    {LSL_DIVIDE,		ST_MULTIPLY,		"/",	LSL_LEFT2RIGHT,				NULL, NULL, evaluateOperationToken},
-    {LSL_NEGATION,		ST_NEGATE,		"-",	LSL_RIGHT2LEFT | LSL_UNARY,		NULL, NULL, evaluateOperationToken},
-    {LSL_BOOL_NOT,		ST_BOOL_NOT,		"!",	LSL_RIGHT2LEFT | LSL_UNARY,		NULL, NULL, evaluateOperationToken},
-    {LSL_BIT_NOT,		ST_BIT_NOT,		"~",	LSL_RIGHT2LEFT | LSL_UNARY,		NULL, NULL, evaluateOperationToken},
-    {LSL_TYPECAST_CLOSE,	ST_NONE,		")",	LSL_RIGHT2LEFT | LSL_UNARY,		NULL, NULL, evaluateNoToken},
-    {LSL_TYPECAST_OPEN,		ST_NONE,		"(",	LSL_RIGHT2LEFT | LSL_UNARY,		NULL, NULL, evaluateOperationToken},
-    {LSL_ANGLE_CLOSE,		ST_NONE,		">",	LSL_LEFT2RIGHT | LSL_CREATION,		NULL, NULL, evaluateNoToken},
-    {LSL_ANGLE_OPEN,		ST_NONE,		"<",	LSL_LEFT2RIGHT | LSL_CREATION,		NULL, NULL, evaluateOperationToken},
-    {LSL_BRACKET_CLOSE,		ST_NONE,		"]",	LSL_INNER2OUTER | LSL_CREATION,		NULL, NULL, evaluateNoToken},
-    {LSL_BRACKET_OPEN,		ST_NONE,		"[",	LSL_INNER2OUTER | LSL_CREATION,		NULL, NULL, evaluateOperationToken},
-    {LSL_PARENTHESIS_CLOSE,	ST_NONE,		")",	LSL_INNER2OUTER,			NULL, NULL, evaluateNoToken},
-    {LSL_PARENTHESIS_OPEN,	ST_NONE,		"(",	LSL_INNER2OUTER,			outputParenthesisToken, NULL, eveluateParenthesisToken},
-    {LSL_ASSIGNMENT_CONCATENATE,ST_CONCATENATION,	"+=",	LSL_RIGHT2LEFT | LSL_ASSIGNMENT,	NULL, NULL, evaluateOperationToken},
-    {LSL_ASSIGNMENT_ADD,	ST_CONCATENATION,	"+=",	LSL_RIGHT2LEFT | LSL_ASSIGNMENT,	NULL, NULL, evaluateOperationToken},
-    {LSL_ASSIGNMENT_SUBTRACT,	ST_ASSIGNMENT,		"-=",	LSL_RIGHT2LEFT | LSL_ASSIGNMENT,	NULL, NULL, evaluateOperationToken},
-    {LSL_ASSIGNMENT_MULTIPLY,	ST_ASSIGNMENT,		"*=",	LSL_RIGHT2LEFT | LSL_ASSIGNMENT,	NULL, NULL, evaluateOperationToken},
-    {LSL_ASSIGNMENT_MODULO,	ST_MODULO,		"%=",	LSL_RIGHT2LEFT | LSL_ASSIGNMENT,	NULL, NULL, evaluateOperationToken},
-    {LSL_ASSIGNMENT_DIVIDE,	ST_ASSIGNMENT,		"/=",	LSL_RIGHT2LEFT | LSL_ASSIGNMENT,	NULL, NULL, evaluateOperationToken},
-    {LSL_ASSIGNMENT_PLAIN,	ST_CONCATENATION,	"=",	LSL_RIGHT2LEFT | LSL_ASSIGNMENT,	NULL, NULL, evaluateOperationToken},
-    {LSL_DOT,			ST_NONE,		".",	LSL_RIGHT2LEFT,				NULL, NULL, evaluateOperationToken},
-    {LSL_DECREMENT_POST,	ST_NONE,		"--",	LSL_RIGHT2LEFT | LSL_UNARY,		NULL, NULL, evaluateOperationToken},
-    {LSL_DECREMENT_PRE,		ST_NONE,		"--",	LSL_RIGHT2LEFT | LSL_UNARY,		NULL, NULL, evaluateOperationToken},
-    {LSL_INCREMENT_POST,	ST_NONE,		"++",	LSL_RIGHT2LEFT | LSL_UNARY,		NULL, NULL, evaluateOperationToken},
-    {LSL_INCREMENT_PRE,		ST_NONE,		"++",	LSL_RIGHT2LEFT | LSL_UNARY,		NULL, NULL, evaluateOperationToken},
-    {LSL_COMMA,			ST_NONE,		",",	LSL_LEFT2RIGHT,				NULL, NULL, evaluateOperationToken},
-
-    {LSL_EXPRESSION,		ST_NONE,	"expression",	LSL_NONE	,			NULL, NULL, NULL},
+    {LSL_NOT_EQUAL,		ST_EQUALITY,		"!=",	LSL_RIGHT2LEFT,				NULL, evaluateOperationToken},
+    {LSL_EQUAL,			ST_EQUALITY,		"==",	LSL_RIGHT2LEFT,				NULL, evaluateOperationToken},
+    {LSL_GREATER_EQUAL,		ST_COMPARISON,		">=",	LSL_RIGHT2LEFT,				NULL, evaluateOperationToken},
+    {LSL_LESS_EQUAL,		ST_COMPARISON,		"<=",	LSL_RIGHT2LEFT,				NULL, evaluateOperationToken},
+    {LSL_GREATER_THAN,		ST_COMPARISON,		">",	LSL_RIGHT2LEFT,				NULL, evaluateOperationToken},
+    {LSL_LESS_THAN,		ST_COMPARISON,		"<",	LSL_RIGHT2LEFT,				NULL, evaluateOperationToken},
+    {LSL_RIGHT_SHIFT,		ST_BITWISE,		">>",	LSL_LEFT2RIGHT,				NULL, evaluateOperationToken},
+    {LSL_LEFT_SHIFT,		ST_BITWISE,		"<<",	LSL_LEFT2RIGHT,				NULL, evaluateOperationToken},
+    {LSL_CONCATENATE,		ST_ADD,			"+",	LSL_LEFT2RIGHT,				NULL, evaluateOperationToken},
+    {LSL_ADD,			ST_ADD,			"+",	LSL_LEFT2RIGHT,				NULL, evaluateOperationToken},
+    {LSL_SUBTRACT,		ST_SUBTRACT,		"-",	LSL_LEFT2RIGHT,				NULL, evaluateOperationToken},
+    {LSL_CROSS_PRODUCT,		ST_NONE,		"%",	LSL_LEFT2RIGHT,				NULL, evaluateOperationToken},
+    {LSL_DOT_PRODUCT,		ST_NONE,		"*",	LSL_LEFT2RIGHT,				NULL, evaluateOperationToken},
+    {LSL_MULTIPLY,		ST_MULTIPLY,		"*",	LSL_LEFT2RIGHT,				NULL, evaluateOperationToken},
+    {LSL_MODULO,		ST_MODULO,		"%",	LSL_LEFT2RIGHT,				NULL, evaluateOperationToken},
+    {LSL_DIVIDE,		ST_MULTIPLY,		"/",	LSL_LEFT2RIGHT,				NULL, evaluateOperationToken},
+    {LSL_NEGATION,		ST_NEGATE,		"-",	LSL_RIGHT2LEFT | LSL_UNARY,		NULL, evaluateOperationToken},
+    {LSL_BOOL_NOT,		ST_BOOL_NOT,		"!",	LSL_RIGHT2LEFT | LSL_UNARY,		NULL, evaluateOperationToken},
+    {LSL_BIT_NOT,		ST_BIT_NOT,		"~",	LSL_RIGHT2LEFT | LSL_UNARY,		NULL, evaluateOperationToken},
+    {LSL_TYPECAST_CLOSE,	ST_NONE,		")",	LSL_RIGHT2LEFT | LSL_UNARY,		NULL, evaluateNoToken},
+    {LSL_TYPECAST_OPEN,		ST_NONE,		"(",	LSL_RIGHT2LEFT | LSL_UNARY,		NULL, evaluateOperationToken},
+    {LSL_ANGLE_CLOSE,		ST_NONE,		">",	LSL_LEFT2RIGHT | LSL_CREATION,		NULL, evaluateNoToken},
+    {LSL_ANGLE_OPEN,		ST_NONE,		"<",	LSL_LEFT2RIGHT | LSL_CREATION,		NULL, evaluateOperationToken},
+    {LSL_BRACKET_CLOSE,		ST_NONE,		"]",	LSL_INNER2OUTER | LSL_CREATION,		NULL, evaluateNoToken},
+    {LSL_BRACKET_OPEN,		ST_NONE,		"[",	LSL_INNER2OUTER | LSL_CREATION,		NULL, evaluateOperationToken},
+    {LSL_PARENTHESIS_CLOSE,	ST_NONE,		")",	LSL_INNER2OUTER,			NULL, evaluateNoToken},
+    {LSL_PARENTHESIS_OPEN,	ST_NONE,		"(",	LSL_INNER2OUTER,			outputParenthesisToken, eveluateParenthesisToken},
+    {LSL_ASSIGNMENT_CONCATENATE,ST_CONCATENATION,	"+=",	LSL_RIGHT2LEFT | LSL_ASSIGNMENT,	NULL, evaluateOperationToken},
+    {LSL_ASSIGNMENT_ADD,	ST_CONCATENATION,	"+=",	LSL_RIGHT2LEFT | LSL_ASSIGNMENT,	NULL, evaluateOperationToken},
+    {LSL_ASSIGNMENT_SUBTRACT,	ST_ASSIGNMENT,		"-=",	LSL_RIGHT2LEFT | LSL_ASSIGNMENT,	NULL, evaluateOperationToken},
+    {LSL_ASSIGNMENT_MULTIPLY,	ST_ASSIGNMENT,		"*=",	LSL_RIGHT2LEFT | LSL_ASSIGNMENT,	NULL, evaluateOperationToken},
+    {LSL_ASSIGNMENT_MODULO,	ST_MODULO,		"%=",	LSL_RIGHT2LEFT | LSL_ASSIGNMENT,	NULL, evaluateOperationToken},
+    {LSL_ASSIGNMENT_DIVIDE,	ST_ASSIGNMENT,		"/=",	LSL_RIGHT2LEFT | LSL_ASSIGNMENT,	NULL, evaluateOperationToken},
+    {LSL_ASSIGNMENT_PLAIN,	ST_CONCATENATION,	"=",	LSL_RIGHT2LEFT | LSL_ASSIGNMENT,	NULL, evaluateOperationToken},
+    {LSL_DOT,			ST_NONE,		".",	LSL_RIGHT2LEFT,				NULL, evaluateOperationToken},
+    {LSL_DECREMENT_POST,	ST_NONE,		"--",	LSL_RIGHT2LEFT | LSL_UNARY,		NULL, evaluateOperationToken},
+    {LSL_DECREMENT_PRE,		ST_NONE,		"--",	LSL_RIGHT2LEFT | LSL_UNARY,		NULL, evaluateOperationToken},
+    {LSL_INCREMENT_POST,	ST_NONE,		"++",	LSL_RIGHT2LEFT | LSL_UNARY,		NULL, evaluateOperationToken},
+    {LSL_INCREMENT_PRE,		ST_NONE,		"++",	LSL_RIGHT2LEFT | LSL_UNARY,		NULL, evaluateOperationToken},
+    {LSL_COMMA,			ST_NONE,		",",	LSL_LEFT2RIGHT,				NULL, evaluateOperationToken},
+
+    {LSL_EXPRESSION,		ST_NONE,	"expression",	LSL_NONE	,			NULL, NULL},
 
     // Types.
-    {LSL_FLOAT,			ST_NONE,	"float",	LSL_NONE,				outputFloatToken, NULL, evaluateFloatToken},
-    {LSL_INTEGER,		ST_NONE,	"integer",	LSL_NONE,				outputIntegerToken, NULL, evaluateIntegerToken},
-    {LSL_KEY,			ST_NONE,	"key",		LSL_NONE,				NULL, NULL, NULL},
-    {LSL_LIST,			ST_NONE,	"list",		LSL_NONE,				NULL, NULL, NULL},
-    {LSL_ROTATION,		ST_NONE,	"rotation",	LSL_NONE,				NULL, NULL, NULL},
-    {LSL_STRING,		ST_NONE,	"string",	LSL_NONE,				NULL, NULL, NULL},
-    {LSL_VECTOR,		ST_NONE,	"vector",	LSL_NONE,				NULL, NULL, NULL},
+    {LSL_FLOAT,			ST_NONE,	"float",	LSL_NONE,				outputFloatToken, evaluateFloatToken},
+    {LSL_INTEGER,		ST_NONE,	"integer",	LSL_NONE,				outputIntegerToken, evaluateIntegerToken},
+    {LSL_KEY,			ST_NONE,	"key",		LSL_NONE,				NULL, NULL},
+    {LSL_LIST,			ST_NONE,	"list",		LSL_NONE,				NULL, NULL},
+    {LSL_ROTATION,		ST_NONE,	"rotation",	LSL_NONE,				NULL, NULL},
+    {LSL_STRING,		ST_NONE,	"string",	LSL_NONE,				NULL, NULL},
+    {LSL_VECTOR,		ST_NONE,	"vector",	LSL_NONE,				NULL, NULL},
 
     // Types names.
-    {LSL_TYPE_FLOAT,		ST_NONE,	"float",	LSL_NONE,				NULL, NULL, NULL},
-    {LSL_TYPE_INTEGER,		ST_NONE,	"integer",	LSL_NONE,				NULL, NULL, NULL},
-    {LSL_TYPE_KEY,		ST_NONE,	"key",		LSL_NONE,				NULL, NULL, NULL},
-    {LSL_TYPE_LIST,		ST_NONE,	"list",		LSL_NONE,				NULL, NULL, NULL},
-    {LSL_TYPE_ROTATION,		ST_NONE,	"rotation",	LSL_NONE,				NULL, NULL, NULL},
-    {LSL_TYPE_STRING,		ST_NONE,	"string",	LSL_NONE,				NULL, NULL, NULL},
-    {LSL_TYPE_VECTOR,		ST_NONE,	"vector",	LSL_NONE,				NULL, NULL, NULL},
+    {LSL_TYPE_FLOAT,		ST_NONE,	"float",	LSL_NONE,				NULL, NULL},
+    {LSL_TYPE_INTEGER,		ST_NONE,	"integer",	LSL_NONE,				NULL, NULL},
+    {LSL_TYPE_KEY,		ST_NONE,	"key",		LSL_NONE,				NULL, NULL},
+    {LSL_TYPE_LIST,		ST_NONE,	"list",		LSL_NONE,				NULL, NULL},
+    {LSL_TYPE_ROTATION,		ST_NONE,	"rotation",	LSL_NONE,				NULL, NULL},
+    {LSL_TYPE_STRING,		ST_NONE,	"string",	LSL_NONE,				NULL, NULL},
+    {LSL_TYPE_VECTOR,		ST_NONE,	"vector",	LSL_NONE,				NULL, NULL},
 
     // Then the rest of the syntax tokens.
-    {LSL_IDENTIFIER,		ST_NONE,	"identifier",	LSL_NONE,				outputVariableToken, NULL, NULL},
-
-    {LSL_LABEL,			ST_NONE,	"@",		LSL_NONE,				NULL, NULL, NULL},
-
-    {LSL_DO,			ST_NONE,	"do",		LSL_NONE,				NULL, NULL, NULL},
-    {LSL_FOR,			ST_NONE,	"for",		LSL_NONE,				NULL, NULL, NULL},
-    {LSL_ELSE_IF,		ST_NONE,	"else if",	LSL_NONE,				NULL, NULL, NULL},
-    {LSL_ELSE,			ST_NONE,	"else",		LSL_NONE,				NULL, NULL, NULL},
-    {LSL_IF,			ST_NONE,	"if",		LSL_NONE,				NULL, NULL, NULL},
-    {LSL_JUMP,			ST_NONE,	"jump",		LSL_NONE,				NULL, NULL, NULL},
-    {LSL_RETURN,		ST_NONE,	"return",	LSL_NONE,				NULL, NULL, NULL},
-    {LSL_STATE_CHANGE,		ST_NONE,	"state",	LSL_NONE,				NULL, NULL, NULL},
-    {LSL_WHILE,			ST_NONE,	"while",	LSL_NONE,				NULL, NULL, NULL},
-    {LSL_STATEMENT,		ST_NONE,	";",		LSL_NOIGNORE,				outputStatementToken, NULL, evaluateStatementToken},
-
-    {LSL_BLOCK_CLOSE,		ST_NONE,	"}",		LSL_NONE,				NULL, NULL, NULL},
-    {LSL_BLOCK_OPEN,		ST_NONE,	"{",		LSL_NONE,				NULL, NULL, NULL},
-    {LSL_PARAMETER,		ST_NONE,	"parameter",	LSL_NONE,				outputParameterToken, NULL, NULL},
-    {LSL_PARAMETER_LIST,	ST_NONE,	"plist",	LSL_NONE,				outputParameterListToken, NULL, NULL},
-    {LSL_FUNCTION,		ST_NONE,	"function",	LSL_NONE,				outputFunctionToken, NULL, NULL},
-    {LSL_STATE,			ST_NONE,	"state",	LSL_NONE,				outputStateToken, NULL, NULL},
-    {LSL_SCRIPT,		ST_NONE,	"",		LSL_NONE,				NULL, NULL, NULL},
-
-    {LSL_UNKNOWN,		ST_NONE,	"unknown",	LSL_NONE,				NULL, NULL, NULL},
+    {LSL_IDENTIFIER,		ST_NONE,	"identifier",	LSL_NONE,				outputVariableToken, NULL},
+
+    {LSL_LABEL,			ST_NONE,	"@",		LSL_NONE,				NULL, NULL},
+
+    {LSL_DO,			ST_NONE,	"do",		LSL_NONE,				NULL, NULL},
+    {LSL_FOR,			ST_NONE,	"for",		LSL_NONE,				NULL, NULL},
+    {LSL_ELSE_IF,		ST_NONE,	"else if",	LSL_NONE,				NULL, NULL},
+    {LSL_ELSE,			ST_NONE,	"else",		LSL_NONE,				NULL, NULL},
+    {LSL_IF,			ST_NONE,	"if",		LSL_NONE,				NULL, NULL},
+    {LSL_JUMP,			ST_NONE,	"jump",		LSL_NONE,				NULL, NULL},
+    {LSL_RETURN,		ST_NONE,	"return",	LSL_NONE,				NULL, NULL},
+    {LSL_STATE_CHANGE,		ST_NONE,	"state",	LSL_NONE,				NULL, NULL},
+    {LSL_WHILE,			ST_NONE,	"while",	LSL_NONE,				NULL, NULL},
+    {LSL_STATEMENT,		ST_NONE,	";",		LSL_NOIGNORE,				outputStatementToken, evaluateStatementToken},
+
+    {LSL_BLOCK_CLOSE,		ST_NONE,	"}",		LSL_NONE,				NULL, NULL},
+    {LSL_BLOCK_OPEN,		ST_NONE,	"{",		LSL_NONE,				NULL, NULL},
+    {LSL_PARAMETER,		ST_NONE,	"parameter",	LSL_NONE,				outputParameterToken, NULL},
+    {LSL_PARAMETER_LIST,	ST_NONE,	"plist",	LSL_NONE,				outputParameterListToken, NULL},
+    {LSL_FUNCTION,		ST_NONE,	"function",	LSL_NONE,				outputFunctionToken, NULL},
+    {LSL_STATE,			ST_NONE,	"state",	LSL_NONE,				outputStateToken, NULL},
+    {LSL_SCRIPT,		ST_NONE,	"",		LSL_NONE,				NULL,  NULL},
+
+    {LSL_UNKNOWN,		ST_NONE,	"unknown",	LSL_NONE,				NULL, NULL},
 
     // A sentinal.
-    {999999, ST_NONE, NULL, LSL_NONE, NULL, NULL, NULL}
+    {999999, ST_NONE, NULL, LSL_NONE, NULL, NULL}
 };
 
 allowedTypes allowed[] = 
@@ -770,114 +770,96 @@ static LSL_Leaf *evaluateStatementToken(LSL_Leaf *content, LSL_Leaf *left, LSL_L
     return result;
 }
 
-static void outputLeaf(FILE *file, LSL_Leaf *leaf)
+static void outputLeaf(FILE *file, outputMode mode, LSL_Leaf *leaf)
 {
     if (leaf)
     {
-	outputLeaf(file, leaf->left);
+	outputLeaf(file, mode, leaf->left);
 	if ((!(LSL_NOIGNORE & leaf->token->flags)) && (leaf->ignorableText))
 	    fprintf(file, "%s", leaf->ignorableText);
 	if (leaf->token->output)
-	    leaf->token->output(file, leaf);
+	    leaf->token->output(file, mode, leaf);
 	else
 	    fprintf(file, "%s", leaf->token->token);
-	outputLeaf(file, leaf->right);
+	outputLeaf(file, mode, leaf->right);
     }
 }
 
-static void outputFloatToken(FILE *file, LSL_Leaf *content)
+static void outputFloatToken(FILE *file, outputMode mode, LSL_Leaf *content)
 {
     if (content)
 	fprintf(file, "%g", content->value.floatValue);
 }
 
-static void outputFunctionToken(FILE *file, LSL_Leaf *content)
+static void outputFunctionToken(FILE *file, outputMode mode, LSL_Leaf *content)
 {
     if (content)
     {
 	LSL_Function *func = content->value.functionValue;
 
-	outputLeaf(file, func->type);
+	outputLeaf(file, mode, func->type);
 	fprintf(file, "%s", func->name);
-	outputLeaf(file, func->params);
-	outputLeaf(file, func->block);
+	outputLeaf(file, mode, func->params);
+	outputLeaf(file, mode, func->block);
     }
 }
 
-static void outputIntegerToken(FILE *file, LSL_Leaf *content)
+static void outputIntegerToken(FILE *file, outputMode mode, LSL_Leaf *content)
 {
     if (content)
 	fprintf(file, "%d", content->value.integerValue);
 }
 
-static void outputParameterToken(FILE *file, LSL_Leaf *content)
+static void outputParameterToken(FILE *file, outputMode mode, LSL_Leaf *content)
 {
     if (content)
 	fprintf(file, "%s", content->value.parameterValue->name);
 }
 
-static void outputParameterListToken(FILE *file, LSL_Leaf *content)
+static void outputParameterListToken(FILE *file, outputMode mode, LSL_Leaf *content)
 {
     if (content)
-	outputLeaf(file, content->value.listValue);
+	outputLeaf(file, mode, content->value.listValue);
 }
 
-static void outputParenthesisToken(FILE *file, LSL_Leaf *content)
+static void outputParenthesisToken(FILE *file, outputMode mode, LSL_Leaf *content)
 {
     if (content)
     {
 	fprintf(file, "%s", content->token->token);
-	outputLeaf(file, content->value.parenthesis->contents);
-	outputLeaf(file, content->value.parenthesis->right);
+	outputLeaf(file, mode, content->value.parenthesis->contents);
+	outputLeaf(file, mode, content->value.parenthesis->right);
     }
 }
 
-static void outputStateToken(FILE *file, LSL_Leaf *content)
+static void outputStateToken(FILE *file, outputMode mode, LSL_Leaf *content)
 {
     if (content)
     {
 	LSL_State *state = content->value.stateValue;
 
 	fprintf(file, "%s", state->name);
-	outputLeaf(file, state->block);
+	outputLeaf(file, mode, state->block);
     }
 }
 
-static void outputStatementToken(FILE *file, LSL_Leaf *content)
+static void outputStatementToken(FILE *file, outputMode mode, LSL_Leaf *content)
 {
     if (content)
     {
-	outputLeaf(file, content->value.statementValue->expressions);
+	outputLeaf(file, mode, content->value.statementValue->expressions);
 	if (content->ignorableText)
 	    fprintf(file, "%s", content->ignorableText);
 	fprintf(file, "%s", content->token->token);
     }
 }
 
-static void outputVariableToken(FILE *file, LSL_Leaf *content)
+static void outputVariableToken(FILE *file, outputMode mode, LSL_Leaf *content)
 {
     if (content)
 	fprintf(file, "%s", content->value.variableValue->name);
 }
 
-
-static void convertLeaf2Lua(FILE *file, LSL_Leaf *leaf)
-{
-    if (leaf)
-    {
-	convertLeaf2Lua(file, leaf->left);
-	if ((!(LSL_NOIGNORE & leaf->token->flags)) && (leaf->ignorableText))
-	    fprintf(file, "%s", leaf->ignorableText);
-	if (leaf->token->convert)
-	    leaf->token->convert(file, leaf);
-	else if (leaf->token->output)
-	    leaf->token->output(file, leaf);
-	else
-	    fprintf(file, "%s", leaf->token->token);
-	convertLeaf2Lua(file, leaf->right);
-    }
-}
-
 static void doneParsing(LuaSL_yyparseParam *param)
 {
     if (param->ast)
@@ -887,7 +869,7 @@ static void doneParsing(LuaSL_yyparseParam *param)
 	char outName[PATH_MAX];
 	char luaName[PATH_MAX];
 
-	outputLeaf(stdout, param->ast);
+	outputLeaf(stdout, OM_LSL, param->ast);
 	printf("\n");
 	evaluateLeaf(param->ast, NULL, NULL);
 	printf("\n");
@@ -900,7 +882,7 @@ static void doneParsing(LuaSL_yyparseParam *param)
 	if (out)
 	{
 //	    int count;
-	    outputLeaf(out, param->ast);
+	    outputLeaf(out, OM_LSL, param->ast);
 	    fclose(out);
 	    sprintf(buffer, "diff %s %s", param->fileName, outName);
 //	    count = system(buffer);
@@ -913,7 +895,7 @@ static void doneParsing(LuaSL_yyparseParam *param)
 	out = fopen(luaName, "w");
 	if (out)
 	{
-	    convertLeaf2Lua(out, param->ast);
+	    outputLeaf(out, OM_LUA, param->ast);
 	    fclose(out);
 	}
 	else
diff --git a/LuaSL/src/LuaSL_LSL_tree.h b/LuaSL/src/LuaSL_LSL_tree.h
index e9fddb7..020a92e 100644
--- a/LuaSL/src/LuaSL_LSL_tree.h
+++ b/LuaSL/src/LuaSL_LSL_tree.h
@@ -45,8 +45,13 @@ extern int lowestToken;
 
 typedef int LSL_Type;
 
-typedef void (*convertToken2Lua) (FILE *file, LSL_Leaf *content);
-typedef void (*outputToken) (FILE *file, LSL_Leaf *content);
+typedef enum
+{
+    OM_LSL,
+    OM_LUA
+} outputMode;
+
+typedef void (*outputToken) (FILE *file, outputMode mode, LSL_Leaf *content);
 typedef LSL_Leaf * (*evaluateToken) (LSL_Leaf  *content, LSL_Leaf *left, LSL_Leaf *right);
 
 #ifndef FALSE
@@ -165,7 +170,6 @@ struct _LSL_Token
     char 		*token;
     LSL_Flags		flags;
     outputToken		output;
-    convertToken2Lua	convert;
     evaluateToken	evaluate;
 };
 
-- 
cgit v1.1