#define macros implemented

git-svn-id: http://picoc.googlecode.com/svn/trunk@27 21eae674-98b7-11dd-bd71-f92a316d2d60
This commit is contained in:
zik.saleeba 2009-01-05 04:28:54 +00:00
parent 995266ce9c
commit 93a6dffee4
2 changed files with 42 additions and 21 deletions

59
parse.c
View file

@ -150,8 +150,6 @@ void ParseFunctionCall(struct LexState *Lexer, struct Value *Result, Str *FuncNa
if (Result->Typ != TypeFunction) if (Result->Typ != TypeFunction)
ProgramFail(Lexer, "not a function - can't call"); ProgramFail(Lexer, "not a function - can't call");
// XXX - handle macros here too
StackFrameAdd(Lexer); StackFrameAdd(Lexer);
if (Result->Val.Integer >= 0) if (Result->Val.Integer >= 0)
FuncLexer = FunctionStore[Result->Val.Integer]; FuncLexer = FunctionStore[Result->Val.Integer];
@ -223,7 +221,14 @@ int ParseValue(struct LexState *Lexer, struct Value *Result, struct Value **LVal
if (RunIt) if (RunIt)
{ {
VariableGet(Lexer, &Result->Val.String, Result, LValue); VariableGet(Lexer, &Result->Val.String, Result, LValue);
if (!ISVALUETYPE(Result->Typ)) if (Result->Typ == TypeMacro)
{
struct LexState MacroLexer = FunctionStore[Result->Val.Integer];
if (!ParseExpression(&MacroLexer, Result, TRUE))
ProgramFail(&MacroLexer, "expression expected");
}
else if (!ISVALUETYPE(Result->Typ))
ProgramFail(Lexer, "bad variable type"); ProgramFail(Lexer, "bad variable type");
} }
} }
@ -275,7 +280,7 @@ int ParseExpression(struct LexState *Lexer, struct Value *Result, int RunIt)
{ {
case TokenAddAssign: TotalValue.Val.Integer += CurrentValue.Val.Integer; break; case TokenAddAssign: TotalValue.Val.Integer += CurrentValue.Val.Integer; break;
case TokenSubtractAssign: TotalValue.Val.Integer -= CurrentValue.Val.Integer; break; case TokenSubtractAssign: TotalValue.Val.Integer -= CurrentValue.Val.Integer; break;
default: TotalValue.Val.Integer = CurrentValue.Val.Integer; printf("---> %d\n", TotalValue.Val.Integer); break; default: TotalValue.Val.Integer = CurrentValue.Val.Integer; break;
} }
*TotalLValue = TotalValue; *TotalLValue = TotalValue;
} }
@ -336,7 +341,7 @@ int ParseExpression(struct LexState *Lexer, struct Value *Result, int RunIt)
case TokenEquality: TotalValue.Val.Integer = TotalValue.Val.Integer == CurrentValue.Val.Integer; break; case TokenEquality: TotalValue.Val.Integer = TotalValue.Val.Integer == CurrentValue.Val.Integer; break;
case TokenLessThan: TotalValue.Val.Integer = TotalValue.Val.Integer < CurrentValue.Val.Integer; break; case TokenLessThan: TotalValue.Val.Integer = TotalValue.Val.Integer < CurrentValue.Val.Integer; break;
case TokenGreaterThan: TotalValue.Val.Integer = TotalValue.Val.Integer > CurrentValue.Val.Integer; break; case TokenGreaterThan: TotalValue.Val.Integer = TotalValue.Val.Integer > CurrentValue.Val.Integer; break;
case TokenLessEqual: printf("compare %d <= %d\n", TotalValue.Val.Integer, CurrentValue.Val.Integer); TotalValue.Val.Integer = TotalValue.Val.Integer <= CurrentValue.Val.Integer; break; case TokenLessEqual: TotalValue.Val.Integer = TotalValue.Val.Integer <= CurrentValue.Val.Integer; break;
case TokenGreaterEqual: TotalValue.Val.Integer = TotalValue.Val.Integer >= CurrentValue.Val.Integer; break; case TokenGreaterEqual: TotalValue.Val.Integer = TotalValue.Val.Integer >= CurrentValue.Val.Integer; break;
case TokenLogicalAnd: TotalValue.Val.Integer = TotalValue.Val.Integer && CurrentValue.Val.Integer; break; case TokenLogicalAnd: TotalValue.Val.Integer = TotalValue.Val.Integer && CurrentValue.Val.Integer; break;
case TokenLogicalOr: TotalValue.Val.Integer = TotalValue.Val.Integer || CurrentValue.Val.Integer; break; case TokenLogicalOr: TotalValue.Val.Integer = TotalValue.Val.Integer || CurrentValue.Val.Integer; break;
@ -369,7 +374,7 @@ void ParseFunctionDefinition(struct LexState *Lexer, Str *Identifier, struct Lex
struct Value FuncValue; struct Value FuncValue;
if (FunctionStoreUsed >= FUNCTION_STORE_MAX) if (FunctionStoreUsed >= FUNCTION_STORE_MAX)
ProgramFail(Lexer, "too many functions defined"); ProgramFail(Lexer, "too many functions/macros defined");
FunctionStore[FunctionStoreUsed] = *PreState; FunctionStore[FunctionStoreUsed] = *PreState;
LexGetPlainToken(Lexer); LexGetPlainToken(Lexer);
@ -388,6 +393,29 @@ void ParseFunctionDefinition(struct LexState *Lexer, Str *Identifier, struct Lex
ProgramFail(Lexer, "'%S' is already defined", Identifier); ProgramFail(Lexer, "'%S' is already defined", Identifier);
} }
/* parse a #define macro definition and store it for later */
void ParseMacroDefinition(struct LexState *Lexer)
{
union AnyValue MacroName;
struct Value MacroValue;
if (LexGetToken(Lexer, &MacroName) != TokenIdentifier)
ProgramFail(Lexer, "identifier expected");
if (FunctionStoreUsed >= FUNCTION_STORE_MAX)
ProgramFail(Lexer, "too many functions/macros defined");
FunctionStore[FunctionStoreUsed] = *Lexer;
LexToEndOfLine(Lexer);
FunctionStore[FunctionStoreUsed].End = Lexer->Pos;
MacroValue.Typ = TypeMacro;
MacroValue.Val.Integer = FunctionStoreUsed;
FunctionStoreUsed++;
if (!TableSet(&GlobalTable, &MacroName.String, &MacroValue))
ProgramFail(Lexer, "'%S' is already defined", &MacroName.String);
}
void ParseFor(struct LexState *Lexer, struct Value *Result, int RunIt) void ParseFor(struct LexState *Lexer, struct Value *Result, int RunIt)
{ {
struct Value Conditional; struct Value Conditional;
@ -541,23 +569,16 @@ int ParseStatement(struct LexState *Lexer, int RunIt)
break; break;
case TokenHashDefine: case TokenHashDefine:
if (LexGetToken(Lexer, &LexerValue) != TokenIdentifier) ParseMacroDefinition(Lexer);
ProgramFail(Lexer, "identifier expected");
CValue.Val.String.Str = Lexer->Pos;
LexToEndOfLine(Lexer);
CValue.Val.String.Len = Lexer->Pos - CValue.Val.String.Str;
CValue.Typ = TypeMacro;
VariableDefine(Lexer, &LexerValue.String, &CValue);
break; break;
case TokenHashInclude: case TokenHashInclude:
ProgramFail(Lexer, "not implemented"); case TokenBreak:
break; case TokenSwitch:
case TokenCase:
case TokenReturn:
case TokenDefault: case TokenDefault:
if (RunIt) ProgramFail(Lexer, "not implemented yet");
printf("Hello\n");
break; break;
default: default:

View file

@ -5,8 +5,8 @@
/* configurable options */ /* configurable options */
#define USE_MALLOC #define USE_MALLOC
#define GLOBAL_TABLE_SIZE 199 /* global variable table */ #define GLOBAL_TABLE_SIZE 397 /* global variable table */
#define FUNCTION_STORE_MAX 50 /* maximum number of used-defined functions */ #define FUNCTION_STORE_MAX 200 /* maximum number of used-defined functions and macros */
#define STACK_MAX 10 /* maximum function call stack depth */ #define STACK_MAX 10 /* maximum function call stack depth */
#define PARAMETER_MAX 10 /* maximum number of parameters to a function */ #define PARAMETER_MAX 10 /* maximum number of parameters to a function */
#define LOCAL_TABLE_SIZE 11 /* maximum number of local variables */ #define LOCAL_TABLE_SIZE 11 /* maximum number of local variables */