#define macros implemented
git-svn-id: http://picoc.googlecode.com/svn/trunk@27 21eae674-98b7-11dd-bd71-f92a316d2d60
This commit is contained in:
parent
995266ce9c
commit
93a6dffee4
59
parse.c
59
parse.c
|
@ -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:
|
||||||
|
|
4
picoc.h
4
picoc.h
|
@ -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 */
|
||||||
|
|
Loading…
Reference in a new issue