changed lexer/parser to be able to read float constants, if they have "f"-suffix
This commit is contained in:
23
lex.ll
23
lex.ll
@@ -76,7 +76,7 @@ static int allTokens[] = {
|
|||||||
TOKEN_TASK, TOKEN_TRUE, TOKEN_TYPEDEF, TOKEN_UNIFORM, TOKEN_UNMASKED,
|
TOKEN_TASK, TOKEN_TRUE, TOKEN_TYPEDEF, TOKEN_UNIFORM, TOKEN_UNMASKED,
|
||||||
TOKEN_UNSIGNED, TOKEN_VARYING, TOKEN_VOID, TOKEN_WHILE,
|
TOKEN_UNSIGNED, TOKEN_VARYING, TOKEN_VOID, TOKEN_WHILE,
|
||||||
TOKEN_STRING_C_LITERAL, TOKEN_DOTDOTDOT,
|
TOKEN_STRING_C_LITERAL, TOKEN_DOTDOTDOT,
|
||||||
TOKEN_FLOAT_CONSTANT,
|
TOKEN_FLOAT_CONSTANT, TOKEN_DOUBLE_CONSTANT,
|
||||||
TOKEN_INT8_CONSTANT, TOKEN_UINT8_CONSTANT,
|
TOKEN_INT8_CONSTANT, TOKEN_UINT8_CONSTANT,
|
||||||
TOKEN_INT16_CONSTANT, TOKEN_UINT16_CONSTANT,
|
TOKEN_INT16_CONSTANT, TOKEN_UINT16_CONSTANT,
|
||||||
TOKEN_INT32_CONSTANT, TOKEN_UINT32_CONSTANT,
|
TOKEN_INT32_CONSTANT, TOKEN_UINT32_CONSTANT,
|
||||||
@@ -152,6 +152,7 @@ void ParserInit() {
|
|||||||
tokenToName[TOKEN_STRING_C_LITERAL] = "\"C\"";
|
tokenToName[TOKEN_STRING_C_LITERAL] = "\"C\"";
|
||||||
tokenToName[TOKEN_DOTDOTDOT] = "...";
|
tokenToName[TOKEN_DOTDOTDOT] = "...";
|
||||||
tokenToName[TOKEN_FLOAT_CONSTANT] = "TOKEN_FLOAT_CONSTANT";
|
tokenToName[TOKEN_FLOAT_CONSTANT] = "TOKEN_FLOAT_CONSTANT";
|
||||||
|
tokenToName[TOKEN_DOUBLE_CONSTANT] = "TOKEN_DOUBLE_CONSTANT";
|
||||||
tokenToName[TOKEN_INT8_CONSTANT] = "TOKEN_INT8_CONSTANT";
|
tokenToName[TOKEN_INT8_CONSTANT] = "TOKEN_INT8_CONSTANT";
|
||||||
tokenToName[TOKEN_UINT8_CONSTANT] = "TOKEN_UINT8_CONSTANT";
|
tokenToName[TOKEN_UINT8_CONSTANT] = "TOKEN_UINT8_CONSTANT";
|
||||||
tokenToName[TOKEN_INT16_CONSTANT] = "TOKEN_INT16_CONSTANT";
|
tokenToName[TOKEN_INT16_CONSTANT] = "TOKEN_INT16_CONSTANT";
|
||||||
@@ -266,6 +267,7 @@ void ParserInit() {
|
|||||||
tokenNameRemap["TOKEN_STRING_C_LITERAL"] = "\"C\"";
|
tokenNameRemap["TOKEN_STRING_C_LITERAL"] = "\"C\"";
|
||||||
tokenNameRemap["TOKEN_DOTDOTDOT"] = "\'...\'";
|
tokenNameRemap["TOKEN_DOTDOTDOT"] = "\'...\'";
|
||||||
tokenNameRemap["TOKEN_FLOAT_CONSTANT"] = "float constant";
|
tokenNameRemap["TOKEN_FLOAT_CONSTANT"] = "float constant";
|
||||||
|
tokenNameRemap["TOKEN_DOUBLE_CONSTANT"] = "double constant";
|
||||||
tokenNameRemap["TOKEN_INT8_CONSTANT"] = "int8 constant";
|
tokenNameRemap["TOKEN_INT8_CONSTANT"] = "int8 constant";
|
||||||
tokenNameRemap["TOKEN_UINT8_CONSTANT"] = "unsigned int8 constant";
|
tokenNameRemap["TOKEN_UINT8_CONSTANT"] = "unsigned int8 constant";
|
||||||
tokenNameRemap["TOKEN_INT16_CONSTANT"] = "int16 constant";
|
tokenNameRemap["TOKEN_INT16_CONSTANT"] = "int16 constant";
|
||||||
@@ -341,6 +343,8 @@ inline int ispcRand() {
|
|||||||
WHITESPACE [ \t\r]+
|
WHITESPACE [ \t\r]+
|
||||||
INT_NUMBER (([0-9]+)|(0x[0-9a-fA-F]+)|(0b[01]+))[uUlL]*[kMG]?[uUlL]*
|
INT_NUMBER (([0-9]+)|(0x[0-9a-fA-F]+)|(0b[01]+))[uUlL]*[kMG]?[uUlL]*
|
||||||
INT_NUMBER_DOTDOTDOT (([0-9]+)|(0x[0-9a-fA-F]+)|(0b[01]+))[uUlL]*[kMG]?[uUlL]*\.\.\.
|
INT_NUMBER_DOTDOTDOT (([0-9]+)|(0x[0-9a-fA-F]+)|(0b[01]+))[uUlL]*[kMG]?[uUlL]*\.\.\.
|
||||||
|
DOUBLE_NUMBER (([0-9]+|(([0-9]+\.[0-9]*?)|(\.[0-9]+)))([eE][-+]?[0-9]+)??)
|
||||||
|
HEX_DOUBLE_NUMBER (0x[01](\.[0-9a-fA-F]*)?p[-+]?[0-9]+?)
|
||||||
FLOAT_NUMBER (([0-9]+|(([0-9]+\.[0-9]*[fF]?)|(\.[0-9]+)))([eE][-+]?[0-9]+)?[fF]?)
|
FLOAT_NUMBER (([0-9]+|(([0-9]+\.[0-9]*[fF]?)|(\.[0-9]+)))([eE][-+]?[0-9]+)?[fF]?)
|
||||||
HEX_FLOAT_NUMBER (0x[01](\.[0-9a-fA-F]*)?p[-+]?[0-9]+[fF]?)
|
HEX_FLOAT_NUMBER (0x[01](\.[0-9a-fA-F]*)?p[-+]?[0-9]+[fF]?)
|
||||||
|
|
||||||
@@ -438,15 +442,28 @@ L?\"(\\.|[^\\"])*\" { lStringConst(&yylval, &yylloc); return TOKEN_STRING_LITERA
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
{DOUBLE_NUMBER} {
|
||||||
|
RT;
|
||||||
|
yylval.doubleVal = atof(yytext);
|
||||||
|
return TOKEN_DOUBLE_CONSTANT;
|
||||||
|
}
|
||||||
|
|
||||||
|
{HEX_DOUBLE_NUMBER} {
|
||||||
|
RT;
|
||||||
|
yylval.doubleVal = lParseHexFloat(yytext);
|
||||||
|
return TOKEN_DOUBLE_CONSTANT;
|
||||||
|
}
|
||||||
|
|
||||||
{FLOAT_NUMBER} {
|
{FLOAT_NUMBER} {
|
||||||
RT;
|
RT;
|
||||||
yylval.floatVal = atof(yytext);
|
yylval.floatVal = (float)atof(yytext);
|
||||||
return TOKEN_FLOAT_CONSTANT;
|
return TOKEN_FLOAT_CONSTANT;
|
||||||
}
|
}
|
||||||
|
|
||||||
{HEX_FLOAT_NUMBER} {
|
{HEX_FLOAT_NUMBER} {
|
||||||
RT;
|
RT;
|
||||||
yylval.floatVal = lParseHexFloat(yytext);
|
yylval.floatVal = (float)lParseHexFloat(yytext);
|
||||||
return TOKEN_FLOAT_CONSTANT;
|
return TOKEN_FLOAT_CONSTANT;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
11
parse.yy
11
parse.yy
@@ -149,7 +149,8 @@ struct ForeachDimension {
|
|||||||
|
|
||||||
%union {
|
%union {
|
||||||
uint64_t intVal;
|
uint64_t intVal;
|
||||||
double floatVal;
|
float floatVal;
|
||||||
|
double doubleVal;
|
||||||
std::string *stringVal;
|
std::string *stringVal;
|
||||||
const char *constCharPtr;
|
const char *constCharPtr;
|
||||||
|
|
||||||
@@ -185,7 +186,7 @@ struct ForeachDimension {
|
|||||||
%token TOKEN_INT64_CONSTANT TOKEN_UINT64_CONSTANT
|
%token TOKEN_INT64_CONSTANT TOKEN_UINT64_CONSTANT
|
||||||
%token TOKEN_INT32DOTDOTDOT_CONSTANT TOKEN_UINT32DOTDOTDOT_CONSTANT
|
%token TOKEN_INT32DOTDOTDOT_CONSTANT TOKEN_UINT32DOTDOTDOT_CONSTANT
|
||||||
%token TOKEN_INT64DOTDOTDOT_CONSTANT TOKEN_UINT64DOTDOTDOT_CONSTANT
|
%token TOKEN_INT64DOTDOTDOT_CONSTANT TOKEN_UINT64DOTDOTDOT_CONSTANT
|
||||||
%token TOKEN_FLOAT_CONSTANT TOKEN_STRING_C_LITERAL
|
%token TOKEN_FLOAT_CONSTANT TOKEN_DOUBLE_CONSTANT TOKEN_STRING_C_LITERAL
|
||||||
%token TOKEN_IDENTIFIER TOKEN_STRING_LITERAL TOKEN_TYPE_NAME TOKEN_NULL
|
%token TOKEN_IDENTIFIER TOKEN_STRING_LITERAL TOKEN_TYPE_NAME TOKEN_NULL
|
||||||
%token TOKEN_PTR_OP TOKEN_INC_OP TOKEN_DEC_OP TOKEN_LEFT_OP TOKEN_RIGHT_OP
|
%token TOKEN_PTR_OP TOKEN_INC_OP TOKEN_DEC_OP TOKEN_LEFT_OP TOKEN_RIGHT_OP
|
||||||
%token TOKEN_LE_OP TOKEN_GE_OP TOKEN_EQ_OP TOKEN_NE_OP
|
%token TOKEN_LE_OP TOKEN_GE_OP TOKEN_EQ_OP TOKEN_NE_OP
|
||||||
@@ -326,9 +327,13 @@ primary_expression
|
|||||||
(uint64_t)yylval.intVal, @1);
|
(uint64_t)yylval.intVal, @1);
|
||||||
}
|
}
|
||||||
| TOKEN_FLOAT_CONSTANT {
|
| TOKEN_FLOAT_CONSTANT {
|
||||||
$$ = new ConstExpr(AtomicType::UniformDouble->GetAsConstType(),
|
$$ = new ConstExpr(AtomicType::UniformFloat->GetAsConstType(),
|
||||||
yylval.floatVal, @1);
|
yylval.floatVal, @1);
|
||||||
}
|
}
|
||||||
|
| TOKEN_DOUBLE_CONSTANT {
|
||||||
|
$$ = new ConstExpr(AtomicType::UniformDouble->GetAsConstType(),
|
||||||
|
yylval.doubleVal, @1);
|
||||||
|
}
|
||||||
| TOKEN_TRUE {
|
| TOKEN_TRUE {
|
||||||
$$ = new ConstExpr(AtomicType::UniformBool->GetAsConstType(), true, @1);
|
$$ = new ConstExpr(AtomicType::UniformBool->GetAsConstType(), true, @1);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user