diff options
author | xleroy <xleroy@fca1b0fc-160b-0410-b1d3-a4f43f01ea2e> | 2008-08-09 08:06:33 +0000 |
---|---|---|
committer | xleroy <xleroy@fca1b0fc-160b-0410-b1d3-a4f43f01ea2e> | 2008-08-09 08:06:33 +0000 |
commit | 285f5bec5bb03d4e825e5d866e94008088dd6155 (patch) | |
tree | 9df69ded9ed4f4049e0b3887fdd99fcdf3b1746f /test/raytracer/gmlparser.c | |
parent | a83f0c1710cc5143dd885e84c94e14f7d3216f93 (diff) | |
download | compcert-285f5bec5bb03d4e825e5d866e94008088dd6155.tar.gz compcert-285f5bec5bb03d4e825e5d866e94008088dd6155.zip |
Ajout nouveaux tests
git-svn-id: https://yquem.inria.fr/compcert/svn/compcert/trunk@708 fca1b0fc-160b-0410-b1d3-a4f43f01ea2e
Diffstat (limited to 'test/raytracer/gmlparser.c')
-rw-r--r-- | test/raytracer/gmlparser.c | 102 |
1 files changed, 102 insertions, 0 deletions
diff --git a/test/raytracer/gmlparser.c b/test/raytracer/gmlparser.c new file mode 100644 index 00000000..b0a6cbc1 --- /dev/null +++ b/test/raytracer/gmlparser.c @@ -0,0 +1,102 @@ +/* Parser for GML */ + +#include "config.h" + +#include "arrays.h" +#include "gml.h" +#include "gmllexer.h" +#include "gmlparser.h" + +static struct array * parse_tokenlist(void); + +static int parse_token(struct tok * t) +{ + get_lexeme(); + switch (current_lexeme.kind) { + case OPERATOR: + discard_lexeme(); + t->tag = current_lexeme.u.op; + break; + case IDENTIFIER: + discard_lexeme(); + t->tag = Identifier; + t->u.s = current_lexeme.u.s; + break; + case BINDER: + discard_lexeme(); + t->tag = Binder; + t->u.s = current_lexeme.u.s; + break; + case BOOLEAN: + discard_lexeme(); + t->tag = Boolean; + t->u.i = current_lexeme.u.i; + break; + case INTEGER: + discard_lexeme(); + t->tag = Integer; + t->u.i = current_lexeme.u.i; + break; + case REAL: + discard_lexeme(); + t->tag = Real; + t->u.d = current_lexeme.u.d; + break; + case STRING: + discard_lexeme(); + t->tag = String; + t->u.s = current_lexeme.u.s; + break; + case LBRACE: + discard_lexeme(); + t->tag = Function; + t->u.a = parse_tokenlist(); + get_lexeme(); + if (current_lexeme.kind != RBRACE) { + fprintf(stderr, "} expected\n"); + exit(2); + } + discard_lexeme(); + break; + case LBRACKET: + discard_lexeme(); + t->tag = Array; + t->u.a = parse_tokenlist(); + get_lexeme(); + if (current_lexeme.kind != RBRACKET) { + fprintf(stderr, "] expected\n"); + exit(2); + } + discard_lexeme(); + break; + default: + return 0; + } + return 1; +} + +static struct array * parse_tokenlist(void) +{ + struct array * a = alloc_array(sizeof(struct tok), 10); + struct tok t; + int i = 0; + while (parse_token(&t)) { + extend_array(struct tok, a); + set_array_large(struct tok, a, i, t); + i++; + } + return a; +} + +struct array * parse_program(void) +{ + struct array * a = parse_tokenlist(); + get_lexeme(); + if (current_lexeme.kind != END_OF_FILE) { + fprintf(stderr, "syntax error at end of program\n"); + exit(2); + } + return a; +} + + |