Moving towards a working new type system
git-svn-id: http://picoc.googlecode.com/svn/trunk@36 21eae674-98b7-11dd-bd71-f92a316d2d60
This commit is contained in:
parent
fad5c6db69
commit
b9e1086cbb
41
parse.c
41
parse.c
|
@ -8,8 +8,8 @@ int ParameterUsed = 0;
|
||||||
struct Value ReturnValue;
|
struct Value ReturnValue;
|
||||||
|
|
||||||
/* local prototypes */
|
/* local prototypes */
|
||||||
int ParseExpression(struct LexState *Lexer, struct Value *Result, int RunIt);
|
int ParseExpression(struct LexState *Lexer, struct Value **Result, int RunIt);
|
||||||
void ParseIntExpression(struct LexState *Lexer, struct Value *Result, int RunIt);
|
void ParseIntExpression(struct LexState *Lexer, struct Value **Result, int RunIt);
|
||||||
int ParseStatement(struct LexState *Lexer, int RunIt);
|
int ParseStatement(struct LexState *Lexer, int RunIt);
|
||||||
int ParseArguments(struct LexState *Lexer, int RunIt);
|
int ParseArguments(struct LexState *Lexer, int RunIt);
|
||||||
|
|
||||||
|
@ -26,32 +26,32 @@ void ParseInit()
|
||||||
void ParseParameterList(struct LexState *CallLexer, struct LexState *FuncLexer, int RunIt)
|
void ParseParameterList(struct LexState *CallLexer, struct LexState *FuncLexer, int RunIt)
|
||||||
{
|
{
|
||||||
struct ValueType *Typ;
|
struct ValueType *Typ;
|
||||||
union AnyValue Identifier;
|
Str Identifier;
|
||||||
enum LexToken Token = LexGetPlainToken(FuncLexer); /* open bracket */
|
enum LexToken Token = LexGetPlainToken(FuncLexer); /* open bracket */
|
||||||
int ParamCount;
|
int ParamCount;
|
||||||
|
|
||||||
for (ParamCount = 0; ParamCount < ParameterUsed; ParamCount++)
|
for (ParamCount = 0; ParamCount < ParameterUsed; ParamCount++)
|
||||||
{
|
{
|
||||||
TypeParse(FuncLexer, &Typ);
|
TypeParse(FuncLexer, &Typ, &Identifier);
|
||||||
Token = LexGetToken(FuncLexer, &Identifier);
|
if (Identifier->Len != 0)
|
||||||
if (Token != TokenComma && Token != TokenCloseBracket)
|
|
||||||
{ /* there's an identifier */
|
{ /* there's an identifier */
|
||||||
if (Token != TokenIdentifier)
|
|
||||||
ProgramFail(FuncLexer, "invalid parameter");
|
|
||||||
|
|
||||||
if (RunIt)
|
if (RunIt)
|
||||||
{
|
{
|
||||||
if (Parameter[ParamCount].Typ != Typ)
|
if (Parameter[ParamCount].Typ != Typ)
|
||||||
ProgramFail(CallLexer, "parameter %d has the wrong type", ParamCount+1);
|
ProgramFail(CallLexer, "parameter %d has the wrong type", ParamCount+1);
|
||||||
|
|
||||||
VariableDefine(FuncLexer, &Identifier.String, &Parameter[ParamCount]);
|
VariableDefine(FuncLexer, &Identifier, &Parameter[ParamCount]);
|
||||||
}
|
}
|
||||||
|
|
||||||
Token = LexGetPlainToken(FuncLexer);
|
|
||||||
if (Token != TokenComma && Token != TokenCloseBracket)
|
|
||||||
ProgramFail(FuncLexer, "comma expected");
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
Token = LexGetPlainToken(FuncLexer);
|
||||||
|
if (ParamCount < ParameterUsed-1 && Token != TokenComma)
|
||||||
|
ProgramFail(FuncLexer, "comma expected");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Token != TokenCloseBracket)
|
||||||
|
ProgramFail(FuncLexer, "')' expected");
|
||||||
|
|
||||||
if (ParameterUsed == 0)
|
if (ParameterUsed == 0)
|
||||||
Token = LexGetPlainToken(FuncLexer);
|
Token = LexGetPlainToken(FuncLexer);
|
||||||
|
|
||||||
|
@ -60,7 +60,7 @@ void ParseParameterList(struct LexState *CallLexer, struct LexState *FuncLexer,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* do a function call */
|
/* do a function call */
|
||||||
void ParseFunctionCall(struct LexState *Lexer, struct Value *Result, Str *FuncName, int RunIt)
|
void ParseFunctionCall(struct LexState *Lexer, struct Value **Result, Str *FuncName, int RunIt)
|
||||||
{
|
{
|
||||||
enum LexToken Token = LexGetPlainToken(Lexer); /* open bracket */
|
enum LexToken Token = LexGetPlainToken(Lexer); /* open bracket */
|
||||||
|
|
||||||
|
@ -119,7 +119,7 @@ void ParseFunctionCall(struct LexState *Lexer, struct Value *Result, Str *FuncNa
|
||||||
}
|
}
|
||||||
|
|
||||||
/* parse a single value */
|
/* parse a single value */
|
||||||
int ParseValue(struct LexState *Lexer, struct Value *Result, struct Value **LValue, int RunIt)
|
int ParseValue(struct LexState *Lexer, struct Value **Result, struct Value **LValue, int RunIt)
|
||||||
{
|
{
|
||||||
struct LexState PreState = *Lexer;
|
struct LexState PreState = *Lexer;
|
||||||
enum LexToken Token = LexGetToken(Lexer, Result->Val);
|
enum LexToken Token = LexGetToken(Lexer, Result->Val);
|
||||||
|
@ -188,7 +188,7 @@ int ParseValue(struct LexState *Lexer, struct Value *Result, struct Value **LVal
|
||||||
}
|
}
|
||||||
|
|
||||||
/* parse an expression. operator precedence is not supported */
|
/* parse an expression. operator precedence is not supported */
|
||||||
int ParseExpression(struct LexState *Lexer, struct Value *Result, int RunIt)
|
int ParseExpression(struct LexState *Lexer, struct Value **Result, int RunIt)
|
||||||
{
|
{
|
||||||
struct Value CurrentValue;
|
struct Value CurrentValue;
|
||||||
struct Value *CurrentLValue;
|
struct Value *CurrentLValue;
|
||||||
|
@ -304,7 +304,7 @@ int ParseExpression(struct LexState *Lexer, struct Value *Result, int RunIt)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* parse an expression. operator precedence is not supported */
|
/* parse an expression. operator precedence is not supported */
|
||||||
void ParseIntExpression(struct LexState *Lexer, struct Value *Result, int RunIt)
|
void ParseIntExpression(struct LexState *Lexer, struct Value **Result, int RunIt)
|
||||||
{
|
{
|
||||||
if (!ParseExpression(Lexer, Result, RunIt))
|
if (!ParseExpression(Lexer, Result, RunIt))
|
||||||
ProgramFail(Lexer, "expression expected");
|
ProgramFail(Lexer, "expression expected");
|
||||||
|
@ -363,7 +363,7 @@ void ParseMacroDefinition(struct LexState *Lexer)
|
||||||
ProgramFail(Lexer, "'%S' is already defined", &MacroName.String);
|
ProgramFail(Lexer, "'%S' is already defined", &MacroName.String);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ParseFor(struct LexState *Lexer, struct Value *Result, int RunIt)
|
void ParseFor(struct LexState *Lexer, int RunIt)
|
||||||
{
|
{
|
||||||
struct Value Conditional;
|
struct Value Conditional;
|
||||||
struct LexState PreConditional;
|
struct LexState PreConditional;
|
||||||
|
@ -485,6 +485,7 @@ int ParseStatement(struct LexState *Lexer, int RunIt)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case TokenFor:
|
case TokenFor:
|
||||||
|
ParseFor(Lexer, RunIt);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case TokenSemicolon: break;
|
case TokenSemicolon: break;
|
||||||
|
|
85
picoc.h
85
picoc.h
|
@ -43,71 +43,22 @@ struct Table;
|
||||||
/* lexical tokens */
|
/* lexical tokens */
|
||||||
enum LexToken
|
enum LexToken
|
||||||
{
|
{
|
||||||
TokenNone,
|
TokenNone, TokenEOF, TokenEndOfLine,
|
||||||
TokenEOF,
|
TokenIdentifier, TokenIntegerConstant, TokenFPConstant, TokenStringConstant, TokenCharacterConstant,
|
||||||
TokenIdentifier,
|
TokenOpenBracket, TokenCloseBracket,
|
||||||
TokenIntegerConstant,
|
TokenAssign, TokenPlus, TokenMinus, TokenAsterisk, TokenSlash,
|
||||||
TokenFPConstant,
|
TokenEquality, TokenLessThan, TokenGreaterThan, TokenLessEqual, TokenGreaterEqual,
|
||||||
TokenStringConstant,
|
TokenSemicolon, TokenComma, TokenDot,
|
||||||
TokenCharacterConstant,
|
TokenArrow, TokenAmpersand,
|
||||||
TokenType,
|
TokenLeftBrace, TokenRightBrace,
|
||||||
TokenOpenBracket,
|
TokenLeftAngleBracket, TokenRightAngleBracket,
|
||||||
TokenCloseBracket,
|
TokenLogicalAnd, TokenLogicalOr, TokenArithmeticOr, TokenArithmeticExor, TokenUnaryExor, TokenUnaryNot,
|
||||||
TokenAssign,
|
TokenAddAssign, TokenSubtractAssign,
|
||||||
TokenPlus,
|
TokenIncrement, TokenDecrement,
|
||||||
TokenMinus,
|
TokenIntType, TokenCharType, TokenFloatType, TokenDoubleType, TokenVoidType, TokenEnumType,
|
||||||
TokenAsterisk,
|
TokenLongType, TokenSignedType, TokenShortType, TokenStructType, TokenUnionType, TokenUnsignedType, TokenTypedef,
|
||||||
TokenSlash,
|
TokenDo, TokenElse, TokenFor, TokenIf, TokenWhile, TokenBreak, TokenSwitch, TokenCase, TokenDefault, TokenReturn,
|
||||||
TokenEquality,
|
TokenHashDefine, TokenHashInclude
|
||||||
TokenLessThan,
|
|
||||||
TokenGreaterThan,
|
|
||||||
TokenLessEqual,
|
|
||||||
TokenGreaterEqual,
|
|
||||||
TokenSemicolon,
|
|
||||||
TokenArrow,
|
|
||||||
TokenAmpersand,
|
|
||||||
TokenLeftBrace,
|
|
||||||
TokenRightBrace,
|
|
||||||
TokenLeftAngleBracket,
|
|
||||||
TokenRightAngleBracket,
|
|
||||||
TokenLogicalAnd,
|
|
||||||
TokenLogicalOr,
|
|
||||||
TokenArithmeticOr,
|
|
||||||
TokenArithmeticExor,
|
|
||||||
TokenUnaryExor,
|
|
||||||
TokenUnaryNot,
|
|
||||||
TokenComma,
|
|
||||||
TokenDot,
|
|
||||||
TokenAddAssign,
|
|
||||||
TokenSubtractAssign,
|
|
||||||
TokenIncrement,
|
|
||||||
TokenDecrement,
|
|
||||||
TokenIntType,
|
|
||||||
TokenCharType,
|
|
||||||
TokenFloatType,
|
|
||||||
TokenDoubleType,
|
|
||||||
TokenVoidType,
|
|
||||||
TokenEnumType,
|
|
||||||
TokenLongType,
|
|
||||||
TokenSignedType,
|
|
||||||
TokenShortType,
|
|
||||||
TokenStructType,
|
|
||||||
TokenUnionType,
|
|
||||||
TokenUnsignedType,
|
|
||||||
TokenTypedef,
|
|
||||||
TokenDo,
|
|
||||||
TokenElse,
|
|
||||||
TokenFor,
|
|
||||||
TokenIf,
|
|
||||||
TokenWhile,
|
|
||||||
TokenBreak,
|
|
||||||
TokenSwitch,
|
|
||||||
TokenCase,
|
|
||||||
TokenDefault,
|
|
||||||
TokenReturn,
|
|
||||||
TokenHashDefine,
|
|
||||||
TokenHashInclude,
|
|
||||||
TokenEndOfLine
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/* string type so we can use source file strings */
|
/* string type so we can use source file strings */
|
||||||
|
@ -157,6 +108,7 @@ struct ValueType
|
||||||
enum BaseType Base; /* what kind of type this is */
|
enum BaseType Base; /* what kind of type this is */
|
||||||
int ArraySize; /* the size of an array type */
|
int ArraySize; /* the size of an array type */
|
||||||
int Sizeof; /* the storage required */
|
int Sizeof; /* the storage required */
|
||||||
|
Str Identifier; /* the name of a struct or union */
|
||||||
struct ValueType *FromType; /* the type we're derived from (or NULL) */
|
struct ValueType *FromType; /* the type we're derived from (or NULL) */
|
||||||
struct ValueType *DerivedTypeList; /* first in a list of types derived from this one */
|
struct ValueType *DerivedTypeList; /* first in a list of types derived from this one */
|
||||||
struct ValueType *Next; /* next item in the derived type list */
|
struct ValueType *Next; /* next item in the derived type list */
|
||||||
|
@ -235,6 +187,7 @@ extern struct ValueType FunctionType;
|
||||||
extern struct ValueType MacroType;
|
extern struct ValueType MacroType;
|
||||||
|
|
||||||
/* str.c */
|
/* str.c */
|
||||||
|
void StrCopy(Str *Dest, const Str *Source);
|
||||||
void StrToC(char *Dest, int DestSize, const Str *Source);
|
void StrToC(char *Dest, int DestSize, const Str *Source);
|
||||||
void StrFromC(Str *Dest, const char *Source);
|
void StrFromC(Str *Dest, const char *Source);
|
||||||
int StrEqual(const Str *Str1, const Str *Str2);
|
int StrEqual(const Str *Str1, const Str *Str2);
|
||||||
|
@ -267,7 +220,7 @@ void Parse(const Str *FileName, const Str *Source, int RunIt);
|
||||||
/* type.c */
|
/* type.c */
|
||||||
void TypeInit();
|
void TypeInit();
|
||||||
int TypeSizeof(struct ValueType *Typ);
|
int TypeSizeof(struct ValueType *Typ);
|
||||||
int TypeParse(struct LexState *Lexer, struct ValueType **Typ, Str *Identifier);
|
void TypeParse(struct LexState *Lexer, struct ValueType **Typ, Str *Identifier);
|
||||||
|
|
||||||
/* intrinsic.c */
|
/* intrinsic.c */
|
||||||
void IntrinsicInit(struct Table *GlobalTable);
|
void IntrinsicInit(struct Table *GlobalTable);
|
||||||
|
|
6
str.c
6
str.c
|
@ -7,6 +7,12 @@
|
||||||
#include "picoc.h"
|
#include "picoc.h"
|
||||||
|
|
||||||
|
|
||||||
|
void StrCopy(Str *Dest, const Str *Source)
|
||||||
|
{
|
||||||
|
Dest->Str = Source->Str;
|
||||||
|
Dest->Len = Source->Len;
|
||||||
|
}
|
||||||
|
|
||||||
void StrToC(char *Dest, int DestSize, const Str *Source)
|
void StrToC(char *Dest, int DestSize, const Str *Source)
|
||||||
{
|
{
|
||||||
int CopyLen = min(DestSize-1, Source->Len);
|
int CopyLen = min(DestSize-1, Source->Len);
|
||||||
|
|
34
type.c
34
type.c
|
@ -16,11 +16,11 @@ struct ValueType Type_Type;
|
||||||
/* add a new type to the set of types we know about */
|
/* add a new type to the set of types we know about */
|
||||||
struct ValueType *TypeAdd(struct LexState *Lexer, struct ValueType *ParentType, enum BaseType Base, int ArraySize, Str *Identifier, int Sizeof)
|
struct ValueType *TypeAdd(struct LexState *Lexer, struct ValueType *ParentType, enum BaseType Base, int ArraySize, Str *Identifier, int Sizeof)
|
||||||
{
|
{
|
||||||
struct ValueType *NewType = VariableAlloc(sizeof(struct ValueType));
|
struct ValueType *NewType = VariableAlloc(Lexer, sizeof(struct ValueType));
|
||||||
NewType->Base = Base;
|
NewType->Base = Base;
|
||||||
NewType->ArraySize = ArraySize;
|
NewType->ArraySize = ArraySize;
|
||||||
NewType->Sizeof = Sizeof;
|
NewType->Sizeof = Sizeof;
|
||||||
NewType->Identifier = Identifier;
|
StrCopy(&NewType->Identifier, Identifier);
|
||||||
NewType->Members = NULL;
|
NewType->Members = NULL;
|
||||||
NewType->FromType = ParentType;
|
NewType->FromType = ParentType;
|
||||||
NewType->DerivedTypeList = NULL;
|
NewType->DerivedTypeList = NULL;
|
||||||
|
@ -35,7 +35,7 @@ struct ValueType *TypeGetMatching(struct LexState *Lexer, struct ValueType *Pare
|
||||||
{
|
{
|
||||||
int Sizeof;
|
int Sizeof;
|
||||||
struct ValueType *ThisType = ParentType->DerivedTypeList;
|
struct ValueType *ThisType = ParentType->DerivedTypeList;
|
||||||
while (ThisType != NULL && (ThisType->Base != Base || ThisType->ArraySize != ArraySize || !StrEqual(ThisType->Identifier, Identifier))
|
while (ThisType != NULL && (ThisType->Base != Base || ThisType->ArraySize != ArraySize || !StrEqual(&ThisType->Identifier, Identifier)))
|
||||||
ThisType = ThisType->Next;
|
ThisType = ThisType->Next;
|
||||||
|
|
||||||
if (ThisType != NULL)
|
if (ThisType != NULL)
|
||||||
|
@ -58,12 +58,12 @@ void TypeAddBaseType(struct ValueType *TypeNode, enum BaseType Base, int Sizeof)
|
||||||
TypeNode->Base = Base;
|
TypeNode->Base = Base;
|
||||||
TypeNode->ArraySize = 0;
|
TypeNode->ArraySize = 0;
|
||||||
TypeNode->Sizeof = Sizeof;
|
TypeNode->Sizeof = Sizeof;
|
||||||
TypeNode->Identifier = Identifier;
|
StrFromC(&TypeNode->Identifier, "");
|
||||||
TypeNode->Members = NULL;
|
TypeNode->Members = NULL;
|
||||||
TypeNode->FromType = NULL;
|
TypeNode->FromType = NULL;
|
||||||
TypeNode->DerivedTypeList = NULL;
|
TypeNode->DerivedTypeList = NULL;
|
||||||
TypeNode->Next = UberType->DerivedTypeList;
|
TypeNode->Next = UberType.DerivedTypeList;
|
||||||
UberType->DerivedTypeList = NewType;
|
UberType.DerivedTypeList = TypeNode;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* initialise the type system */
|
/* initialise the type system */
|
||||||
|
@ -92,7 +92,7 @@ void TypeParseStruct(struct LexState *Lexer, struct ValueType **Typ, int IsStruc
|
||||||
if (LexGetToken(Lexer, &LexValue) != TokenIdentifier)
|
if (LexGetToken(Lexer, &LexValue) != TokenIdentifier)
|
||||||
ProgramFail(Lexer, "struct/union name required");
|
ProgramFail(Lexer, "struct/union name required");
|
||||||
|
|
||||||
if (LexGetTokenOnly(Lexer) != TokenOpenBrace)
|
if (LexGetPlainToken(Lexer) != TokenOpenBrace)
|
||||||
ProgramFail(Lexer, "'{' expected");
|
ProgramFail(Lexer, "'{' expected");
|
||||||
|
|
||||||
if (StackLevel != 0)
|
if (StackLevel != 0)
|
||||||
|
@ -123,9 +123,9 @@ void TypeParseStruct(struct LexState *Lexer, struct ValueType **Typ, int IsStruc
|
||||||
if (!TableSet((*Typ)->Members, &MemberIdentifier, MemberValue))
|
if (!TableSet((*Typ)->Members, &MemberIdentifier, MemberValue))
|
||||||
ProgramFail(Lexer, "member '%S' already defined", &MemberIdentifier);
|
ProgramFail(Lexer, "member '%S' already defined", &MemberIdentifier);
|
||||||
|
|
||||||
} while (LexPeekTokenOnly(Lexer) != TokenCloseBrace);
|
} while (LexPeekPlainToken(Lexer) != TokenCloseBrace);
|
||||||
|
|
||||||
LexGetTokenOnly(Lexer);
|
LexGetPlainToken(Lexer);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* parse a type */
|
/* parse a type */
|
||||||
|
@ -134,6 +134,7 @@ void TypeParse(struct LexState *Lexer, struct ValueType **Typ, Str *Identifier)
|
||||||
struct LexState Before;
|
struct LexState Before;
|
||||||
struct LexToken Token;
|
struct LexToken Token;
|
||||||
union AnyValue LexValue;
|
union AnyValue LexValue;
|
||||||
|
struct Value ArraySize;
|
||||||
int Done = FALSE;
|
int Done = FALSE;
|
||||||
*Typ = NULL;
|
*Typ = NULL;
|
||||||
|
|
||||||
|
@ -195,9 +196,18 @@ void TypeParse(struct LexState *Lexer, struct ValueType **Typ, Str *Identifier)
|
||||||
switch (LexGetTokenOnly(Lexer))
|
switch (LexGetTokenOnly(Lexer))
|
||||||
{
|
{
|
||||||
case TokenOpenSquareBracket:
|
case TokenOpenSquareBracket:
|
||||||
if (ParseExpression(xxx)
|
{
|
||||||
XXX - get a closing square bracket
|
struct Value ArraySize;
|
||||||
*Typ = TypeGetMatching(Lexer, *Typ, TypeArray, xxx);
|
union AnyValue ArraySizeAnyValue;
|
||||||
|
ArraySize->Val = &ArraySizeAnyValue;
|
||||||
|
if (!ParseExpression(Lexer, &ArraySize, TRUE))
|
||||||
|
ArraySize->Val->Integer = 0;
|
||||||
|
|
||||||
|
if (LexGetTokenOnly(Lexer) != TokenCloseSquareBracket)
|
||||||
|
ProgramFail(Lexer, "']' expected");
|
||||||
|
|
||||||
|
*Typ = TypeGetMatching(Lexer, *Typ, TypeArray, ArraySize->Val->Integer);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case TokenOpenBracket:
|
case TokenOpenBracket:
|
||||||
|
|
Loading…
Reference in a new issue