summaryrefslogtreecommitdiff
path: root/src/runtime/c/pgf
diff options
context:
space:
mode:
authorkr.angelov <kr.angelov@gmail.com>2012-12-13 11:09:26 +0000
committerkr.angelov <kr.angelov@gmail.com>2012-12-13 11:09:26 +0000
commit2dc8236170e21f27be4450a302b4151e0b0a2b76 (patch)
tree4126691c7844a241ecbdf5717a2f8018c6b74a08 /src/runtime/c/pgf
parent0891ef3f0feefff51b687d4469c7024a80305bec (diff)
bugfix: pgf_read_expr no longer requires a semicolon at the end of an abstract expression
Diffstat (limited to 'src/runtime/c/pgf')
-rw-r--r--src/runtime/c/pgf/expr.c21
1 files changed, 5 insertions, 16 deletions
diff --git a/src/runtime/c/pgf/expr.c b/src/runtime/c/pgf/expr.c
index 3ccb9c232..8f2fc875e 100644
--- a/src/runtime/c/pgf/expr.c
+++ b/src/runtime/c/pgf/expr.c
@@ -141,10 +141,8 @@ struct PgfExprParser {
int next_char;
};
-
static const char pgf_expr_lpar[] = "(";
static const char pgf_expr_rpar[] = ")";
-static const char pgf_expr_semic[] = ";";
static char
pgf_expr_parser_next(PgfExprParser* parser)
@@ -168,6 +166,7 @@ pgf_expr_parser_lookahead(PgfExprParser* parser)
do {
c = pgf_expr_parser_next(parser);
if (!gu_ok(parser->err)) {
+ gu_exn_clear(parser->err);
return NULL;
}
} while (isspace(c));
@@ -178,9 +177,6 @@ pgf_expr_parser_lookahead(PgfExprParser* parser)
case ')':
str = pgf_expr_rpar;
break;
- case ';':
- str = pgf_expr_semic;
- break;
default:
if (isalpha(c)) {
GuPool* tmp_pool = gu_new_pool();
@@ -189,7 +185,7 @@ pgf_expr_parser_lookahead(PgfExprParser* parser)
gu_buf_push(chars, char, c);
c = pgf_expr_parser_next(parser);
if (!gu_ok(parser->err)) {
- return NULL;
+ break;
}
}
parser->next_char = (unsigned char) c;
@@ -235,6 +231,8 @@ pgf_expr_parser_term(PgfExprParser* parser)
if (la == pgf_expr_rpar) {
pgf_expr_parser_consume(parser);
return expr;
+ } else {
+ gu_raise(parser->err, PgfExn);
}
} else if (pgf_expr_parser_token_is_id(la)) {
pgf_expr_parser_consume(parser);
@@ -252,9 +250,8 @@ pgf_expr_parser_expr(PgfExprParser* parser)
{
PgfExpr expr = pgf_expr_parser_term(parser);
if (gu_variant_is_null(expr))
- {
return expr;
- }
+
while (true) {
PgfExpr arg = pgf_expr_parser_term(parser);
if (gu_variant_is_null(arg)) {
@@ -267,8 +264,6 @@ pgf_expr_parser_expr(PgfExprParser* parser)
}
}
-
-
PgfExpr
pgf_read_expr(GuReader* rdr, GuPool* pool, GuExn* err)
{
@@ -281,12 +276,6 @@ pgf_read_expr(GuReader* rdr, GuPool* pool, GuExn* err)
parser->lookahead = NULL;
parser->next_char = -1;
PgfExpr expr = pgf_expr_parser_expr(parser);
- const char* la = pgf_expr_parser_lookahead(parser);
- if (la == pgf_expr_semic) {
- pgf_expr_parser_consume(parser);
- } else {
- expr = gu_null_variant;
- }
gu_pool_free(tmp_pool);
return expr;
}