X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fglsl%2Fparser.cpp;h=d2261126a652d109deba3c4193713568dc317616;hb=6d11ee7d6137117f441951615cd4cde4d59bf968;hp=c9a812ddbd62f8c45184d565186404b33541f410;hpb=4c805f55d89919d6971d600102ab4d6d65d56dc3;p=libs%2Fgl.git diff --git a/source/glsl/parser.cpp b/source/glsl/parser.cpp index c9a812dd..d2261126 100644 --- a/source/glsl/parser.cpp +++ b/source/glsl/parser.cpp @@ -447,7 +447,8 @@ RefPtr Parser::parse_expression(unsigned precedence) if(token==i->token && (!left || i->type!=Operator::PREFIX) && (left || i->type!=Operator::POSTFIX)) oper = i; - if(token==";" || token==")" || token=="]" || token=="," || (oper && precedence && oper->precedence>=precedence)) + bool lower_precedence = (oper && oper->type!=Operator::PREFIX && precedence && oper->precedence>=precedence); + if(token==";" || token==")" || token=="]" || token=="," || lower_precedence) { if(left) return left; @@ -496,11 +497,7 @@ RefPtr Parser::parse_expression(unsigned precedence) left = parexpr; } else if(isdigit(token[0]) || token=="true" || token=="false") - { - RefPtr literal = new Literal; - literal->token = tokenizer.parse_token(); - left = literal; - } + left = parse_literal(); else if(is_identifier(token)) { RefPtr var = create_node(); @@ -522,6 +519,26 @@ RefPtr Parser::parse_expression(unsigned precedence) } } +RefPtr Parser::parse_literal() +{ + RefPtr literal = create_node(); + literal->token = tokenizer.parse_token(); + if(isdigit(literal->token[0])) + { + // TODO have the tokenizer return the type of the token + if(isnumrc(literal->token)) + literal->value = lexical_cast(literal->token); + else + literal->value = lexical_cast(literal->token); + } + else if(literal->token=="true" || literal->token=="false") + literal->value = (literal->token=="true"); + else + throw parse_error(tokenizer.get_location(), literal->token, "a literal"); + + return literal; +} + RefPtr Parser::parse_binary(const RefPtr &left, const Operator &oper) { RefPtr binary = (oper.precedence==16 ?