summaryrefslogtreecommitdiff
path: root/parser.y
diff options
context:
space:
mode:
authorkintel <kintel@b57f626f-c46c-0410-a088-ec61d464b74c>2010-01-30 04:26:05 (GMT)
committerkintel <kintel@b57f626f-c46c-0410-a088-ec61d464b74c>2010-01-30 04:26:05 (GMT)
commit191dc4857c852f1867e80cd9d03a6d1c0921dcb1 (patch)
tree4a6421d50eb6cf70924fc0ba06afccf10df00650 /parser.y
parent6940d171812565209efe679a5d923417c3f47d4a (diff)
header file reorg
git-svn-id: http://svn.clifford.at/openscad/trunk@365 b57f626f-c46c-0410-a088-ec61d464b74c
Diffstat (limited to 'parser.y')
-rw-r--r--parser.y524
1 files changed, 0 insertions, 524 deletions
diff --git a/parser.y b/parser.y
deleted file mode 100644
index c4cd3d4..0000000
--- a/parser.y
+++ /dev/null
@@ -1,524 +0,0 @@
-/*
- * OpenSCAD (www.openscad.at)
- * Copyright (C) 2009 Clifford Wolf <clifford@clifford.at>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-%{
-
-#include "openscad.h"
-#include "printutils.h"
-
-int parser_error_pos = -1;
-
-int parserlex(void);
-void yyerror(char const *s);
-
-int lexerget_lineno(void);
-int lexerlex_destroy(void);
-int lexerlex(void);
-
-QVector<Module*> module_stack;
-Module *module;
-
-class ArgContainer {
-public:
- QString argname;
- Expression *argexpr;
-};
-class ArgsContainer {
-public:
- QVector<QString> argnames;
- QVector<Expression*> argexpr;
-};
-
-%}
-
-%union {
- char *text;
- double number;
- class Value *value;
- class Expression *expr;
- class ModuleInstantiation *inst;
- class ArgContainer *arg;
- class ArgsContainer *args;
-}
-
-%token TOK_MODULE
-%token TOK_FUNCTION
-
-%token <text> TOK_ID
-%token <text> TOK_STRING
-%token <number> TOK_NUMBER
-
-%token TOK_TRUE
-%token TOK_FALSE
-%token TOK_UNDEF
-
-%token LE GE EQ NE AND OR
-
-%left OR
-%left AND
-
-%left '<' LE GE '>'
-%left EQ NE
-
-%left '!' '+' '-'
-%left '*' '/' '%'
-%left '[' ']'
-%left '.'
-
-%right '?' ':'
-
-%type <expr> expr
-%type <expr> vector_expr
-
-%type <inst> module_instantiation
-%type <inst> module_instantiation_list
-%type <inst> single_module_instantiation
-
-%type <args> arguments_call
-%type <args> arguments_decl
-
-%type <arg> argument_call
-%type <arg> argument_decl
-
-%debug
-
-%%
-
-input:
- /* empty */ |
- statement input ;
-
-statement:
- ';' |
- '{' input '}' |
- module_instantiation {
- if ($1) {
- module->children.append($1);
- } else {
- delete $1;
- }
- } |
- TOK_ID '=' expr ';' {
- bool add_new_assignment = true;
- for (int i = 0; i < module->assignments_var.size(); i++) {
- if (module->assignments_var[i] != QString($1))
- continue;
- delete module->assignments_expr[i];
- module->assignments_expr[i] = $3;
- add_new_assignment = false;
- }
- if (add_new_assignment) {
- module->assignments_var.append($1);
- module->assignments_expr.append($3);
- free($1);
- }
- } |
- TOK_MODULE TOK_ID '(' arguments_decl optional_commas ')' {
- Module *p = module;
- module_stack.append(module);
- module = new Module();
- p->modules[$2] = module;
- module->argnames = $4->argnames;
- module->argexpr = $4->argexpr;
- free($2);
- delete $4;
- } statement {
- module = module_stack.last();
- module_stack.pop_back();
- } |
- TOK_FUNCTION TOK_ID '(' arguments_decl optional_commas ')' '=' expr {
- Function *func = new Function();
- func->argnames = $4->argnames;
- func->argexpr = $4->argexpr;
- func->expr = $8;
- module->functions[$2] = func;
- free($2);
- delete $4;
- } ';' ;
-
-module_instantiation:
- single_module_instantiation ';' {
- $$ = $1;
- } |
- single_module_instantiation '{' module_instantiation_list '}' {
- $$ = $1;
- if ($$) {
- $$->children = $3->children;
- } else {
- for (int i = 0; i < $3->children.count(); i++)
- delete $3->children[i];
- }
- $3->children.clear();
- delete $3;
- } |
- single_module_instantiation module_instantiation {
- $$ = $1;
- if ($$) {
- if ($2)
- $$->children.append($2);
- } else {
- delete $2;
- }
- } ;
-
-module_instantiation_list:
- /* empty */ {
- $$ = new ModuleInstantiation();
- } |
- module_instantiation_list module_instantiation {
- $$ = $1;
- if ($$) {
- if ($2)
- $$->children.append($2);
- } else {
- delete $2;
- }
- } ;
-
-single_module_instantiation:
- TOK_ID '(' arguments_call ')' {
- $$ = new ModuleInstantiation();
- $$->modname = QString($1);
- $$->argnames = $3->argnames;
- $$->argexpr = $3->argexpr;
- free($1);
- delete $3;
- } |
- TOK_ID ':' single_module_instantiation {
- $$ = $3;
- if ($$)
- $$->label = QString($1);
- free($1);
- } |
- '!' single_module_instantiation {
- $$ = $2;
- if ($$)
- $$->tag_root = true;
- } |
- '#' single_module_instantiation {
- $$ = $2;
- if ($$)
- $$->tag_highlight = true;
- } |
- '%' single_module_instantiation {
- $$ = $2;
- if ($$)
- $$->tag_background = true;
- } |
- '*' single_module_instantiation {
- delete $2;
- $$ = NULL;
- };
-
-expr:
- TOK_TRUE {
- $$ = new Expression();
- $$->type = "C";
- $$->const_value = new Value(true);
- } |
- TOK_FALSE {
- $$ = new Expression();
- $$->type = "C";
- $$->const_value = new Value(false);
- } |
- TOK_UNDEF {
- $$ = new Expression();
- $$->type = "C";
- $$->const_value = new Value();
- } |
- TOK_ID {
- $$ = new Expression();
- $$->type = "L";
- $$->var_name = QString($1);
- free($1);
- } |
- expr '.' TOK_ID {
- $$ = new Expression();
- $$->type = "N";
- $$->children.append($1);
- $$->var_name = QString($3);
- free($3);
- } |
- TOK_STRING {
- $$ = new Expression();
- $$->type = "C";
- $$->const_value = new Value(QString($1));
- free($1);
- } |
- TOK_NUMBER {
- $$ = new Expression();
- $$->type = "C";
- $$->const_value = new Value($1);
- } |
- '[' expr ':' expr ']' {
- Expression *e_one = new Expression();
- e_one->type = "C";
- e_one->const_value = new Value(1.0);
- $$ = new Expression();
- $$->type = "R";
- $$->children.append($2);
- $$->children.append(e_one);
- $$->children.append($4);
- } |
- '[' expr ':' expr ':' expr ']' {
- $$ = new Expression();
- $$->type = "R";
- $$->children.append($2);
- $$->children.append($4);
- $$->children.append($6);
- } |
- '[' optional_commas ']' {
- $$ = new Expression();
- $$->type = "C";
- $$->const_value = new Value();
- $$->const_value->type = Value::VECTOR;
- } |
- '[' vector_expr optional_commas ']' {
- $$ = $2;
- } |
- expr '*' expr {
- $$ = new Expression();
- $$->type = "*";
- $$->children.append($1);
- $$->children.append($3);
- } |
- expr '/' expr {
- $$ = new Expression();
- $$->type = "/";
- $$->children.append($1);
- $$->children.append($3);
- } |
- expr '%' expr {
- $$ = new Expression();
- $$->type = "%";
- $$->children.append($1);
- $$->children.append($3);
- } |
- expr '+' expr {
- $$ = new Expression();
- $$->type = "+";
- $$->children.append($1);
- $$->children.append($3);
- } |
- expr '-' expr {
- $$ = new Expression();
- $$->type = "-";
- $$->children.append($1);
- $$->children.append($3);
- } |
- expr '<' expr {
- $$ = new Expression();
- $$->type = "<";
- $$->children.append($1);
- $$->children.append($3);
- } |
- expr LE expr {
- $$ = new Expression();
- $$->type = "<=";
- $$->children.append($1);
- $$->children.append($3);
- } |
- expr EQ expr {
- $$ = new Expression();
- $$->type = "==";
- $$->children.append($1);
- $$->children.append($3);
- } |
- expr NE expr {
- $$ = new Expression();
- $$->type = "!=";
- $$->children.append($1);
- $$->children.append($3);
- } |
- expr GE expr {
- $$ = new Expression();
- $$->type = ">=";
- $$->children.append($1);
- $$->children.append($3);
- } |
- expr '>' expr {
- $$ = new Expression();
- $$->type = ">";
- $$->children.append($1);
- $$->children.append($3);
- } |
- expr AND expr {
- $$ = new Expression();
- $$->type = "&&";
- $$->children.append($1);
- $$->children.append($3);
- } |
- expr OR expr {
- $$ = new Expression();
- $$->type = "||";
- $$->children.append($1);
- $$->children.append($3);
- } |
- '+' expr {
- $$ = $2;
- } |
- '-' expr {
- $$ = new Expression();
- $$->type = "I";
- $$->children.append($2);
- } |
- '!' expr {
- $$ = new Expression();
- $$->type = "!";
- $$->children.append($2);
- } |
- '(' expr ')' {
- $$ = $2;
- } |
- expr '?' expr ':' expr {
- $$ = new Expression();
- $$->type = "?:";
- $$->children.append($1);
- $$->children.append($3);
- $$->children.append($5);
- } |
- expr '[' expr ']' {
- $$ = new Expression();
- $$->type = "[]";
- $$->children.append($1);
- $$->children.append($3);
- } |
- TOK_ID '(' arguments_call ')' {
- $$ = new Expression();
- $$->type = "F";
- $$->call_funcname = QString($1);
- $$->call_argnames = $3->argnames;
- $$->children = $3->argexpr;
- free($1);
- delete $3;
- } ;
-
-optional_commas:
- ',' optional_commas | ;
-
-vector_expr:
- expr {
- $$ = new Expression();
- $$->type = 'V';
- $$->children.append($1);
- } |
- vector_expr ',' optional_commas expr {
- $$ = $1;
- $$->children.append($4);
- } ;
-
-arguments_decl:
- /* empty */ {
- $$ = new ArgsContainer();
- } |
- argument_decl {
- $$ = new ArgsContainer();
- $$->argnames.append($1->argname);
- $$->argexpr.append($1->argexpr);
- delete $1;
- } |
- arguments_decl ',' optional_commas argument_decl {
- $$ = $1;
- $$->argnames.append($4->argname);
- $$->argexpr.append($4->argexpr);
- delete $4;
- } ;
-
-argument_decl:
- TOK_ID {
- $$ = new ArgContainer();
- $$->argname = QString($1);
- $$->argexpr = NULL;
- free($1);
- } |
- TOK_ID '=' expr {
- $$ = new ArgContainer();
- $$->argname = QString($1);
- $$->argexpr = $3;
- free($1);
- } ;
-
-arguments_call:
- /* empty */ {
- $$ = new ArgsContainer();
- } |
- argument_call {
- $$ = new ArgsContainer();
- $$->argnames.append($1->argname);
- $$->argexpr.append($1->argexpr);
- delete $1;
- } |
- arguments_call ',' optional_commas argument_call {
- $$ = $1;
- $$->argnames.append($4->argname);
- $$->argexpr.append($4->argexpr);
- delete $4;
- } ;
-
-argument_call:
- expr {
- $$ = new ArgContainer();
- $$->argexpr = $1;
- } |
- TOK_ID '=' expr {
- $$ = new ArgContainer();
- $$->argname = QString($1);
- $$->argexpr = $3;
- free($1);
- } ;
-
-%%
-
-int parserlex(void)
-{
- return lexerlex();
-}
-
-void yyerror (char const *s)
-{
- // FIXME: We leak memory on parser errors...
- PRINTF("Parser error in line %d: %s\n", lexerget_lineno(), s);
- module = NULL;
-}
-
-extern FILE *lexerin;
-extern const char *parser_input_buffer;
-const char *parser_input_buffer;
-
-AbstractModule *parse(const char *text, int debug)
-{
- lexerin = NULL;
- parser_error_pos = -1;
- parser_input_buffer = text;
-
- module_stack.clear();
- module = new Module();
-
- parserdebug = debug;
- parserparse();
-
- lexerlex_destroy();
-
- if (module)
- parser_error_pos = -1;
-
- return module;
-}
-
contact: Jan Huwald // Impressum