Function calls now work.

git-svn-id: http://picoc.googlecode.com/svn/trunk@21 21eae674-98b7-11dd-bd71-f92a316d2d60
This commit is contained in:
zik.saleeba 2008-12-24 03:27:53 +00:00
parent 69113a26c6
commit a8008e9ac7
2 changed files with 26 additions and 29 deletions

10
hello.c
View file

@ -1,9 +1,7 @@
int a; void fred()
int b;
a = 1;
while (a<=10)
{ {
a = a + 1; default
b = 42;
} }
fred();

39
parse.c
View file

@ -91,36 +91,32 @@ void ParseParameterList(struct LexState *CallLexer, struct LexState *FuncLexer,
{ {
enum ValueType Typ; enum ValueType Typ;
union AnyValue Identifier; union AnyValue Identifier;
enum LexToken Token = TokenNone; enum LexToken Token = LexGetPlainToken(FuncLexer); /* open bracket */
int ParamCount; int ParamCount;
ParamCount = 0; for (ParamCount = 0; ParamCount < ParameterUsed; ParamCount++)
while (ParamCount < ParameterUsed && Token != TokenCloseBracket)
{ {
ParseType(FuncLexer, &Typ); ParseType(FuncLexer, &Typ);
Token = LexGetToken(FuncLexer, &Identifier); Token = LexGetToken(FuncLexer, &Identifier);
if (Token != TokenCloseBracket) if (Token != TokenIdentifier)
ProgramFail(FuncLexer, "invalid parameter");
if (RunIt)
{ {
if (Token != TokenIdentifier) if (Parameter[ParamCount].Typ != Typ)
ProgramFail(FuncLexer, "invalid parameter"); ProgramFail(CallLexer, "parameter %d has the wrong type", ParamCount+1);
if (RunIt) VariableDefine(FuncLexer, &Identifier.String, &Parameter[ParamCount]);
{
if (Parameter[ParamCount].Typ != Typ)
ProgramFail(CallLexer, "parameter %d has the wrong type", ParamCount+1);
VariableDefine(FuncLexer, &Identifier.String, &Parameter[ParamCount]);
ParamCount++;
}
Token = LexGetPlainToken(FuncLexer);
} }
Token = LexGetPlainToken(FuncLexer);
if (Token != TokenComma && Token != TokenCloseBracket) if (Token != TokenComma && Token != TokenCloseBracket)
ProgramFail(FuncLexer, "comma expected"); ProgramFail(FuncLexer, "comma expected");
} }
if (ParameterUsed == 0)
Token = LexGetPlainToken(FuncLexer);
if (ParamCount != 0 || Token != TokenCloseBracket) if (Token != TokenCloseBracket)
ProgramFail(CallLexer, "wrong number of arguments"); ProgramFail(CallLexer, "wrong number of arguments");
} }
@ -145,7 +141,7 @@ void ParseFunctionCall(struct LexState *Lexer, struct Value *Result, Str *FuncNa
else else
{ {
Token = LexGetPlainToken(Lexer); Token = LexGetPlainToken(Lexer);
if (TokenCloseBracket) if (!TokenCloseBracket)
ProgramFail(Lexer, "bad argument"); ProgramFail(Lexer, "bad argument");
} }
} while (Token != TokenCloseBracket); } while (Token != TokenCloseBracket);
@ -361,8 +357,6 @@ int ParseStatement(struct LexState *Lexer, int RunIt)
enum ValueType Typ; enum ValueType Typ;
enum LexToken Token = LexGetToken(Lexer, &LexerValue); enum LexToken Token = LexGetToken(Lexer, &LexerValue);
printf("Token=%d\n", (int)Token);
switch (Token) switch (Token)
{ {
case TokenEOF: case TokenEOF:
@ -497,6 +491,11 @@ int ParseStatement(struct LexState *Lexer, int RunIt)
} }
break; break;
case TokenDefault:
if (RunIt)
printf("Hello\n");
break;
default: default:
*Lexer = PreState; *Lexer = PreState;
return FALSE; return FALSE;