open_toontown_panda3d/pandaapp/src/stitchbase/stitchParser.yxx

497 lines
9.3 KiB
Plaintext

// Filename: stitchParser.y
// Created by: drose (08Nov99)
//
////////////////////////////////////////////////////////////////////
%{
#include "stitchParserDefs.h"
#include "stitchLexerDefs.h"
#include "stitchCommand.h"
////////////////////////////////////////////////////////////////////
// Defining the interface to the parser.
////////////////////////////////////////////////////////////////////
#define YYERROR_VERBOSE
typedef vector<StitchCommand *> CommandStack;
static CommandStack cstack;
static StitchCommand *parent;
void
stitch_init_parser(istream &in, const string &filename,
StitchCommand *tos) {
stitch_init_lexer(in, filename);
parent = tos;
cstack.push_back(parent);
}
%}
%token <number> NUMBER NUMBER_FEET NUMBER_INCHES
%token <str> IDENTIFIER
%token <str> STRING
%token KW_DEFINE
%token KW_LENS
%token KW_INPUT_IMAGE
%token KW_OUTPUT_IMAGE
%token KW_EYEPOINT
%token KW_PERSPECTIVE
%token KW_FISHEYE
%token KW_CYLINDRICAL
%token KW_PSPHERE
%token KW_FOCAL_LENGTH
%token KW_FOV
%token KW_SINGULARITY_TOLERANCE
%token KW_RESOLUTION
%token KW_FILENAME
%token KW_FADE
%token KW_POINT
%token KW_SHOW_POINTS
%token KW_IMAGE_SIZE
%token KW_FILM_SIZE
%token KW_FILM_OFFSET
%token KW_GRID
%token KW_UNTEXTURED_COLOR
%token KW_HPR
%token KW_POS
%token KW_RADIUS
%token KW_ANGLE
%token KW_HEIGHT
%token KW_LAYERS
%token KW_STITCH
%token KW_SCREEN
%token KW_POINTS
%token KW_USING
%token KW_IN
%token KW_MM
%token KW_FT
%token KW_CM
%token KW_P
%type <command> command
%type <command> group_command
%type <command> simple_command
%type <number> length
%type <number> length_units
%type <number> resolution
%type <number> resolution_units
%type <vec> point
%type <vec> vec2
%type <vec> vec3
%type <vec> length_pair
%type <vec> length_triple
%type <vec> color
%type <str> name
%type <str> optional_name
%%
stitch_file:
commands
;
commands:
empty
| commands command
{
// parent->add_nested($2);
}
| commands KW_POINTS '{' points_list '}'
;
command:
group_command
{
parent = $1;
cstack.push_back(parent);
}
nested_commands
{
cstack.pop_back();
parent = cstack.back();
}
| simple_command ';'
{
$$ = $1;
}
;
nested_commands:
'{' commands '}'
| ';'
;
group_command:
KW_DEFINE name
{
$$ = new StitchCommand(parent, StitchCommand::C_define);
$$->set_name($2);
}
| KW_LENS optional_name
{
$$ = new StitchCommand(parent, StitchCommand::C_lens);
$$->set_name($2);
}
| KW_INPUT_IMAGE optional_name
{
$$ = new StitchCommand(parent, StitchCommand::C_input_image);
$$->set_name($2);
}
| KW_OUTPUT_IMAGE optional_name
{
$$ = new StitchCommand(parent, StitchCommand::C_output_image);
$$->set_name($2);
}
| KW_EYEPOINT optional_name
{
$$ = new StitchCommand(parent, StitchCommand::C_eyepoint);
$$->set_name($2);
}
| KW_STITCH optional_name
{
$$ = new StitchCommand(parent, StitchCommand::C_stitch);
$$->set_name($2);
}
| KW_SCREEN optional_name
{
$$ = new StitchCommand(parent, StitchCommand::C_screen);
$$->set_name($2);
}
| KW_USING
{
cstack.push_back(new StitchCommand(parent, StitchCommand::C_using));
}
using_list
{
$$ = cstack.back();
cstack.pop_back();
}
;
simple_command:
KW_PERSPECTIVE
{
$$ = new StitchCommand(parent, StitchCommand::C_perspective);
}
| KW_FISHEYE
{
$$ = new StitchCommand(parent, StitchCommand::C_fisheye);
}
| KW_CYLINDRICAL
{
$$ = new StitchCommand(parent, StitchCommand::C_cylindrical);
}
| KW_PSPHERE
{
$$ = new StitchCommand(parent, StitchCommand::C_psphere);
}
| KW_FOCAL_LENGTH length
{
$$ = new StitchCommand(parent, StitchCommand::C_focal_length);
$$->set_length($2);
}
| KW_FOV NUMBER
{
$$ = new StitchCommand(parent, StitchCommand::C_fov);
$$->set_number($2);
}
| KW_SINGULARITY_TOLERANCE NUMBER
{
$$ = new StitchCommand(parent, StitchCommand::C_singularity_tolerance);
$$->set_number($2);
}
| KW_RESOLUTION resolution
{
$$ = new StitchCommand(parent, StitchCommand::C_resolution);
$$->set_resolution($2);
}
| KW_FILENAME STRING
{
$$ = new StitchCommand(parent, StitchCommand::C_filename);
$$->set_str($2);
}
| KW_FADE STRING
{
$$ = new StitchCommand(parent, StitchCommand::C_fade);
$$->set_str($2);
}
| KW_POINT name point
{
if ($<num_components>3 == 2) {
$$ = new StitchCommand(parent, StitchCommand::C_point2d);
$$->set_point2d((const LPoint2d &)$3);
} else {
$$ = new StitchCommand(parent, StitchCommand::C_point3d);
$$->set_point3d((const LPoint3d &)$3);
}
$$->set_name($2);
}
| KW_SHOW_POINTS NUMBER color
{
$$ = new StitchCommand(parent, StitchCommand::C_show_points);
$$->set_number($2);
$$->set_color($3);
}
| KW_IMAGE_SIZE vec2
{
$$ = new StitchCommand(parent, StitchCommand::C_image_size);
$$->set_point2d((const LPoint2d &)$2);
}
| KW_FILM_SIZE length_pair
{
$$ = new StitchCommand(parent, StitchCommand::C_film_size);
$$->set_length_pair((const LPoint2d &)$2);
}
| KW_FILM_OFFSET length_pair
{
$$ = new StitchCommand(parent, StitchCommand::C_film_offset);
$$->set_length_pair((const LPoint2d &)$2);
}
| KW_GRID vec2
{
$$ = new StitchCommand(parent, StitchCommand::C_grid);
$$->set_point2d((const LPoint2d &)$2);
}
| KW_UNTEXTURED_COLOR color
{
$$ = new StitchCommand(parent, StitchCommand::C_untextured_color);
$$->set_color((const Colord &)$2);
}
| KW_HPR vec3
{
$$ = new StitchCommand(parent, StitchCommand::C_hpr);
$$->set_point3d((const LPoint3d &)$2);
}
| KW_POS length_triple
{
$$ = new StitchCommand(parent, StitchCommand::C_pos);
$$->set_point3d((const LPoint3d &)$2);
}
| KW_RADIUS length
{
$$ = new StitchCommand(parent, StitchCommand::C_radius);
$$->set_number($2);
}
| KW_ANGLE vec2
{
$$ = new StitchCommand(parent, StitchCommand::C_angle);
$$->set_point2d((const LPoint2d &)$2);
}
| KW_HEIGHT length_pair
{
$$ = new StitchCommand(parent, StitchCommand::C_height);
$$->set_point2d((const LPoint2d &)$2);
}
| KW_LAYERS
{
$$ = new StitchCommand(parent, StitchCommand::C_layers);
}
| IDENTIFIER
{
$$ = new StitchCommand(parent, StitchCommand::C_user_command);
if (!$$->add_using($1)) {
yyerror("Undefined identifier " + $1);
}
}
;
using_list:
IDENTIFIER
{
if (!cstack.back()->add_using($1)) {
yyerror("Undefined identifier " + $1);
}
}
| using_list ',' IDENTIFIER
{
if (!cstack.back()->add_using($3)) {
yyerror("Undefined identifier " + $3);
}
}
;
points_list:
empty
| points_list name point ';'
{
StitchCommand *cmd;
if ($<num_components>3 == 2) {
cmd = new StitchCommand(parent, StitchCommand::C_point2d);
cmd->set_point2d((const LPoint2d &)$3);
} else {
cmd = new StitchCommand(parent, StitchCommand::C_point3d);
cmd->set_point3d((const LPoint3d &)$3);
}
cmd->set_name($2);
// parent->add_nested(cmd);
}
;
length:
NUMBER length_units
{
$$ = $1 * $2;
}
| NUMBER_FEET
{
$$ = $1 * 304.8; // ft to mm
}
| NUMBER_INCHES
{
$$ = $1 * 25.4; // in to mm
}
| NUMBER_FEET NUMBER_INCHES
{
if ($1 < 0.0) {
$$ = $1 * 304.8 - $2 * 25.4;
} else {
$$ = $1 * 304.8 + $2 * 25.4;
}
}
| NUMBER
{
$$ = $1; // implicitly mm
}
;
length_units:
KW_IN
{
$$ = 25.4; // in to mm
}
| KW_CM
{
$$ = 10.0; // cm to mm
}
| KW_MM
{
$$ = 1.0;
}
| KW_FT
{
$$ = 304.8; // ft to mm
}
;
resolution:
NUMBER resolution_units
{
$$ = $1 * $2; // convert to pixels per mm
}
;
resolution_units:
KW_P '/' length_units
{
$$ = 1.0 / $3;
}
;
point:
'(' NUMBER NUMBER ')'
{
$$.set($2, $3, 0.0, 0.0);
$<num_components>$ = 2;
}
| '(' NUMBER ',' NUMBER ')'
{
$$.set($2, $4, 0.0, 0.0);
$<num_components>$ = 2;
}
| '(' NUMBER NUMBER NUMBER ')'
{
$$.set($2, $3, $4, 0.0);
$<num_components>$ = 3;
}
| '(' NUMBER ',' NUMBER ',' NUMBER ')'
{
$$.set($2, $4, $6, 0.0);
$<num_components>$ = 3;
}
;
vec2:
'(' NUMBER NUMBER ')'
{
$$.set($2, $3, 0.0, 0.0);
$<num_components>$ = 2;
}
| '(' NUMBER ',' NUMBER ')'
{
$$.set($2, $4, 0.0, 0.0);
$<num_components>$ = 2;
}
;
vec3: '(' NUMBER NUMBER NUMBER ')'
{
$$.set($2, $3, $4, 0.0);
$<num_components>$ = 3;
}
| '(' NUMBER ',' NUMBER ',' NUMBER ')'
{
$$.set($2, $4, $6, 0.0);
$<num_components>$ = 3;
}
;
length_pair:
'(' length ',' length ')'
{
$$.set($2, $4, 0.0, 0.0);
$<num_components>$ = 2;
}
;
length_triple:
'(' length ',' length ',' length ')'
{
$$.set($2, $4, $6, 0.0);
$<num_components>$ = 3;
}
;
color:
'(' NUMBER NUMBER NUMBER ')'
{
$$.set($2, $3, $4, 1.0);
$<num_components>$ = 3;
}
| '(' NUMBER ',' NUMBER ',' NUMBER ')'
{
$$.set($2, $4, $6, 1.0);
$<num_components>$ = 3;
}
| '(' NUMBER NUMBER NUMBER NUMBER ')'
{
$$.set($2, $3, $4, $5);
$<num_components>$ = 4;
}
| '(' NUMBER ',' NUMBER ',' NUMBER ',' NUMBER ')'
{
$$.set($2, $4, $6, $8);
$<num_components>$ = 4;
}
;
name:
IDENTIFIER
;
optional_name:
IDENTIFIER
| empty
{
$$ = "";
}
;
empty:
;