aboutsummaryrefslogtreecommitdiffstats
path: root/test/raytracer/gmlparser.c
diff options
context:
space:
mode:
authorxleroy <xleroy@fca1b0fc-160b-0410-b1d3-a4f43f01ea2e>2008-08-09 08:06:33 +0000
committerxleroy <xleroy@fca1b0fc-160b-0410-b1d3-a4f43f01ea2e>2008-08-09 08:06:33 +0000
commit285f5bec5bb03d4e825e5d866e94008088dd6155 (patch)
tree9df69ded9ed4f4049e0b3887fdd99fcdf3b1746f /test/raytracer/gmlparser.c
parenta83f0c1710cc5143dd885e84c94e14f7d3216f93 (diff)
downloadcompcert-kvx-285f5bec5bb03d4e825e5d866e94008088dd6155.tar.gz
compcert-kvx-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.c102
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;
+}
+
+