diff --git a/parser/parser.lex b/parser/parser.lex index 8922003..d98b9f3 100644 --- a/parser/parser.lex +++ b/parser/parser.lex @@ -29,13 +29,28 @@ \< return LESS; \> return GREATER; -[0-9]+ return DEC_NUMBER; -[0-9]*\.[0-9]+ return REAL_NUMBER; +-?[0-9]+ return DEC_NUMBER; +-?[0-9]*\.[0-9]+ return REAL_NUMBER; +box return BOX; camera return CAMERA; color return COLOR; +height return HEIGHT; +look_at return LOOKAT; +material return MATERIAL; +multisample return MULTISAMPLE; +options return OPTIONS; +plane return PLANE; position return POSITION; +radius return RADIUS; +reflectance return REFLECTANCE; scene return SCENE; +shininess return SHININESS; +size return SIZE; +sphere return SPHERE; +up return UP; +vfov return VFOV; +width return WIDTH; \n /* ignore newlines */ [ \t\v] /* ignore whitespace */ diff --git a/parser/parser.yy b/parser/parser.yy index 902fe4f..f00d991 100644 --- a/parser/parser.yy +++ b/parser/parser.yy @@ -20,6 +20,8 @@ int yywrap() return 1; } +#define YYSTYPE void * + %} %token PLUS; @@ -49,21 +51,105 @@ int yywrap() %token DEC_NUMBER; %token REAL_NUMBER; +%token BOX; %token CAMERA; %token COLOR; +%token HEIGHT; +%token LOOKAT; +%token MATERIAL; +%token MULTISAMPLE; +%token OPTIONS; +%token PLANE; %token POSITION; +%token RADIUS; +%token REFLECTANCE; %token SCENE; +%token SHININESS; +%token SIZE; +%token SPHERE; +%token UP; +%token VFOV; +%token WIDTH; %% scene: /* empty */ - | scene_spec { printf("Saw a number\n"); } + | scene_spec { printf("Saw a scene\n"); } ; +box: BOX LCURLY box_items RCURLY + ; + +box_items: shape_items + | SIZE vector box_items + ; + +camera: CAMERA LCURLY camera_items RCURLY + ; + +camera_items: /* empty */ + | camera_item camera_items + ; + +camera_item: POSITION vector + | LOOKAT vector + | UP vector + | VFOV vector + ; + +material: MATERIAL LCURLY material_items RCURLY + ; + +material_items: /* empty */ + | material_item material_items + ; + +material_item: COLOR vector + | REFLECTANCE number + | SHININESS number + ; + number: DEC_NUMBER | REAL_NUMBER ; +plane: PLANE LCURLY plane_items RCURLY + ; + +plane_items: shape_items + | POSITION vector COMMA number plane_items + ; + +scene_spec: SCENE LCURLY scene_items RCURLY + ; + +scene_items: /* empty */ + | scene_item scene_items + ; + +scene_item: camera + | shape + ; + +shape: plane + | sphere + | box + ; + +shape_items: /* empty */ + | material + ; + +sphere: SPHERE LCURLY sphere_items RCURLY + ; + +sphere_items: shape_items + | RADIUS number sphere_items + ; + +vector: LESS number COMMA number COMMA number GREATER + ; + %% int parse(const char * fileName)