- else
- {
- if (ast_istype(var, ast_value)) {
- ((ast_value*)var)->uses++;
- }
- else if (ast_istype(var, ast_member)) {
- ast_member *mem = (ast_member*)var;
- if (ast_istype(mem->owner, ast_value))
- ((ast_value*)(mem->owner))->uses++;
- }
- }
- vec_push(sy.out, syexp(parser_ctx(parser), var));
- DEBUGSHUNTDO(con_out("push %s\n", parser_tokval(parser)));
- }
- else if (parser->tok == TOKEN_FLOATCONST) {
- ast_value *val;
- if (wantop) {
- parseerror(parser, "expected operator or end of statement, got constant");
- goto onerr;
- }
- wantop = true;
- val = parser_const_float(parser, (parser_token(parser)->constval.f));
- if (!val)
- return NULL;
- vec_push(sy.out, syexp(parser_ctx(parser), (ast_expression*)val));
- DEBUGSHUNTDO(con_out("push %g\n", parser_token(parser)->constval.f));
- }
- else if (parser->tok == TOKEN_INTCONST || parser->tok == TOKEN_CHARCONST) {
- ast_value *val;
- if (wantop) {
- parseerror(parser, "expected operator or end of statement, got constant");
- goto onerr;
- }
- wantop = true;
- val = parser_const_float(parser, (double)(parser_token(parser)->constval.i));
- if (!val)
- return NULL;
- vec_push(sy.out, syexp(parser_ctx(parser), (ast_expression*)val));
- DEBUGSHUNTDO(con_out("push %i\n", parser_token(parser)->constval.i));
- }
- else if (parser->tok == TOKEN_STRINGCONST) {
- ast_value *val;
- if (wantop) {
- parseerror(parser, "expected operator or end of statement, got constant");
- goto onerr;
- }
- wantop = true;
- val = parser_const_string(parser, parser_tokval(parser), false);
- if (!val)
- return NULL;
- vec_push(sy.out, syexp(parser_ctx(parser), (ast_expression*)val));
- DEBUGSHUNTDO(con_out("push string\n"));
- }
- else if (parser->tok == TOKEN_VECTORCONST) {
- ast_value *val;
- if (wantop) {
- parseerror(parser, "expected operator or end of statement, got constant");
- goto onerr;
- }
- wantop = true;
- val = parser_const_vector(parser, parser_token(parser)->constval.v);
- if (!val)
- return NULL;
- vec_push(sy.out, syexp(parser_ctx(parser), (ast_expression*)val));
- DEBUGSHUNTDO(con_out("push '%g %g %g'\n",
- parser_token(parser)->constval.v.x,
- parser_token(parser)->constval.v.y,
- parser_token(parser)->constval.v.z));
- }
- else if (parser->tok == '(') {
- parseerror(parser, "internal error: '(' should be classified as operator");
- goto onerr;
- }
- else if (parser->tok == '[') {
- parseerror(parser, "internal error: '[' should be classified as operator");
- goto onerr;