--- /dev/null
+/* -*- Mode: C++; tab-width: 4; c-basic-offset: 4 -*- */
+
+/* Parser for the Faust language */
+
+%{
+
+#include "tree.hh"
+#include "xtended.hh"
+#include "boxes.hh"
+#include "prim2.hh"
+#include "signals.hh"
+#include "errormsg.hh"
+#include "sourcereader.hh"
+#include "doc.hh"
+#include "ppbox.hh"
+
+#include <string>
+#include <list>
+
+#define YYDEBUG 1
+#define YYERROR_VERBOSE 1
+#define YYMAXDEPTH 100000
+
+using namespace std;
+
+extern char* yytext;
+extern const char* yyfilename;
+extern int yylineno;
+extern int yyerr;
+extern Tree gResult;
+extern bool gStripDocSwitch;
+extern bool gLstDependenciesSwitch;
+extern bool gLstDistributedSwitch;
+extern bool gLstMdocTagsSwitch;
+
+extern map<Tree, set<Tree> > gMetaDataSet;
+extern vector<Tree> gDocVector;
+
+
+int yylex();
+
+//----------------------------------------------------------
+// unquote() : remove enclosing quotes and carriage return
+// characters from string. Returns a Tree
+//----------------------------------------------------------
+char replaceCR(char c)
+{
+ return (c!='\n') ? c : ' ';
+}
+
+Tree unquote(char* str)
+{
+ //-----------copy unquoted filename-------------
+ char buf[512];
+ int j=0;
+
+ if (str[0] == '"') {
+ //it is a quoted string, we remove the quotes
+ for (int i=1; j<511 && str[i];) {
+ buf[j++] = replaceCR(str[i++]);
+ }
+ // remove last quote
+ if (j>0) buf[j-1] = 0;
+ } else {
+ for (int i=0; j<511 && str[i];) {
+ buf[j++] = replaceCR(str[i++]);
+ }
+ }
+ buf[j] = 0;
+
+ return tree(buf);
+ //----------------------------------------------
+}
+
+%}
+
+
+%union {
+ CTree* exp;
+ char* str;
+ string* cppstr;
+ bool b;
+}
+
+%start program
+
+/* With local environment (lowest priority)*/
+%left WITH
+
+/* Block Diagram Algebra */
+/*%left SEQ SPLIT MIX*/
+%right SPLIT MIX
+%right SEQ
+%right PAR
+%left REC
+
+/* Primitive boxes */
+
+%left LT LE EQ GT GE NE
+
+%left ADD SUB OR
+%left MUL DIV MOD AND XOR LSH RSH
+%left POWOP
+%left FDELAY
+%left DELAY1
+%left APPL DOT
+
+%left HASH
+
+%token MEM
+%token PREFIX
+
+%token INTCAST
+%token FLOATCAST
+%token FFUNCTION
+%token FCONSTANT
+%token FVARIABLE
+
+%token BUTTON
+%token CHECKBOX
+%token VSLIDER
+%token HSLIDER
+%token NENTRY
+%token VGROUP
+%token HGROUP
+%token TGROUP
+
+%token HBARGRAPH
+%token VBARGRAPH
+%token ATTACH
+
+
+%token ACOS
+%token ASIN
+%token ATAN
+%token ATAN2
+%token COS
+%token SIN
+%token TAN
+
+%token EXP
+%token LOG
+%token LOG10
+%token POWFUN
+%token SQRT
+
+%token ABS
+%token MIN
+%token MAX
+
+%token FMOD
+%token REMAINDER
+
+%token FLOOR
+%token CEIL
+%token RINT
+
+
+
+%token RDTBL
+%token RWTBL
+
+%token SELECT2
+%token SELECT3
+
+%token INT
+%token FLOAT
+
+
+%token LAMBDA
+%token DOT
+
+%token WIRE
+%token CUT
+%token ENDDEF
+%token VIRG
+%right LPAR
+%left RPAR
+%right LBRAQ
+%left RBRAQ
+%right LCROC
+%left RCROC
+%token WITH
+%token DEF
+
+%token IMPORT
+%token COMPONENT
+%token LIBRARY
+%token ENVIRONMENT
+
+%token IPAR
+%token ISEQ
+%token ISUM
+%token IPROD
+
+%token STRING
+%token FSTRING
+%token IDENT
+%token EXTRA
+
+%token DECLARE
+
+%token CASE
+%token ARROW
+
+%token VECTORIZE
+%token SERIALIZE
+%token HASH
+%token RATE
+%token UPSAMPLE
+%token DOWNSAMPLE
+
+ /* Begin and End tags for documentations, equations and diagrams */
+%token BDOC
+%token EDOC
+%token BEQN
+%token EEQN
+%token BDGM
+%token EDGM
+%token BLST
+%token ELST
+%token BMETADATA
+%token EMETADATA
+%token <cppstr> DOCCHAR
+%token NOTICE
+%token LISTING
+
+%token LSTTRUE
+%token LSTFALSE
+%token LSTDEPENDENCIES
+%token LSTMDOCTAGS
+%token LSTDISTRIBUTED
+%token LSTEQ
+%token LSTQ
+
+
+%type <exp> program
+
+%type <exp> stmtlist
+%type <exp> statement
+
+%type <exp> deflist
+%type <exp> definition
+
+%type <exp> params
+
+%type <exp> expression
+
+%type <exp> defname
+%type <exp> infixexp
+%type <exp> primitive
+%type <exp> argument
+%type <exp> arglist
+
+%type <exp> ident
+%type <exp> name
+
+%type <exp> ffunction
+%type <exp> fconst
+%type <exp> fvariable
+%type <exp> signature
+%type <exp> string
+%type <exp> uqstring
+%type <exp> fstring
+%type <exp> type
+%type <exp> typelist
+%type <exp> fun
+
+%type <exp> fpar
+%type <exp> fseq
+%type <exp> fsum
+%type <exp> fprod
+
+%type <exp> button
+%type <exp> checkbox
+%type <exp> vslider
+%type <exp> hslider
+%type <exp> nentry
+%type <exp> vgroup
+%type <exp> hgroup
+%type <exp> tgroup
+
+%type <exp> vbargraph
+%type <exp> hbargraph
+
+%type <exp> rule
+%type <exp> rulelist
+
+%type <exp> doc
+%type <exp> docelem
+%type <cppstr> doctxt
+%type <exp> doceqn
+%type <exp> docdgm
+%type <exp> docntc
+%type <exp> doclst
+%type <exp> docmtd
+
+%type <exp> lstattrlist
+%type <exp> lstattrdef
+%type <b> lstattrval
+
+
+
+
+
+%% /* grammar rules and actions follow */
+
+program : stmtlist { $$ = $1; gResult = formatDefinitions($$); }
+ ;
+
+stmtlist : /*empty*/ { $$ = nil; }
+ | stmtlist statement { $$ = cons ($2,$1); }
+
+deflist : /*empty*/ { $$ = nil; }
+ | deflist definition { $$ = cons ($2,$1); }
+ ;
+
+statement : IMPORT LPAR uqstring RPAR ENDDEF { $$ = importFile($3); }
+ | DECLARE name string ENDDEF { declareMetadata($2,$3); $$ = nil; }
+ | definition { $$ = $1; }
+ | BDOC doc EDOC { declareDoc($2); $$ = nil; /* cerr << "Yacc : doc : " << *$2 << endl; */ }
+ ;
+
+doc : /* empty */ { $$ = nil; }
+ | doc docelem { $$ = cons ($2,$1); }
+ ;
+
+docelem : doctxt { $$ = docTxt($1->c_str()); delete $1; }
+ | doceqn { $$ = docEqn($1); }
+ | docdgm { $$ = docDgm($1); }
+ | docntc { $$ = docNtc(); }
+ | doclst { $$ = docLst(); }
+ | docmtd { $$ = docMtd($1); }
+ ;
+
+doctxt : /* empty */ { $$ = new string(); }
+ | doctxt DOCCHAR { $$ = &($1->append(yytext)); }
+ ;
+
+doceqn : BEQN expression EEQN { $$ = $2; }
+ ;
+
+docdgm : BDGM expression EDGM { $$ = $2; }
+ ;
+
+docntc : NOTICE { }
+ ;
+
+doclst : BLST lstattrlist ELST { }
+ ;
+
+lstattrlist : /* empty */ { }
+ | lstattrlist lstattrdef { }
+ ;
+
+lstattrdef : LSTDEPENDENCIES LSTEQ LSTQ lstattrval LSTQ { gLstDependenciesSwitch = $4; }
+ | LSTMDOCTAGS LSTEQ LSTQ lstattrval LSTQ { gStripDocSwitch = $4; gStripDocSwitch==true ? gStripDocSwitch=false : gStripDocSwitch=true; }
+ | LSTDISTRIBUTED LSTEQ LSTQ lstattrval LSTQ { gLstDistributedSwitch = $4; }
+ ;
+
+lstattrval : LSTTRUE { $$ = true; }
+ | LSTFALSE { $$ = false; }
+ ;
+
+docmtd : BMETADATA name EMETADATA { $$ = $2; }
+ ;
+
+definition : defname LPAR arglist RPAR DEF expression ENDDEF { $$ = cons($1,cons($3,$6)); }
+ | defname DEF expression ENDDEF { $$ = cons($1,cons(nil,$3)); }
+ | error ENDDEF { $$ = nil; yyerr++; }
+ ;
+
+defname : ident { $$=$1; setDefProp($1, yyfilename, yylineno); }
+ ;
+
+params : ident { $$ = cons($1,nil); }
+ | params PAR ident { $$ = cons($3,$1); }
+ ;
+
+expression : expression WITH LBRAQ deflist RBRAQ { $$ = boxWithLocalDef($1,formatDefinitions($4)); }
+ | expression PAR expression { $$ = boxPar($1,$3); }
+ | expression SEQ expression { $$ = boxSeq($1,$3); }
+ | expression SPLIT expression { $$ = boxSplit($1,$3); }
+ | expression MIX expression { $$ = boxMerge($1,$3); }
+ | expression REC expression { $$ = boxRec($1,$3); }
+ | infixexp { $$ = $1; }
+ ;
+
+infixexp : infixexp ADD infixexp { $$ = boxSeq(boxPar($1,$3),boxPrim2(sigAdd)); }
+ | infixexp SUB infixexp { $$ = boxSeq(boxPar($1,$3),boxPrim2(sigSub)); }
+ | infixexp MUL infixexp { $$ = boxSeq(boxPar($1,$3),boxPrim2(sigMul)); }
+ | infixexp DIV infixexp { $$ = boxSeq(boxPar($1,$3),boxPrim2(sigDiv)); }
+ | infixexp MOD infixexp { $$ = boxSeq(boxPar($1,$3),boxPrim2(sigRem)); }
+ | infixexp POWOP infixexp { $$ = boxSeq(boxPar($1,$3),gPowPrim->box()); }
+ | infixexp FDELAY infixexp { $$ = boxSeq(boxPar($1,$3),boxPrim2(sigFixDelay)); }
+ | infixexp DELAY1 { $$ = boxSeq($1,boxPrim1(sigDelay1)); }
+ | infixexp DOT ident { $$ = boxAccess($1,$3); }
+
+ | infixexp AND infixexp { $$ = boxSeq(boxPar($1,$3),boxPrim2(sigAND)); }
+ | infixexp OR infixexp { $$ = boxSeq(boxPar($1,$3),boxPrim2(sigOR)); }
+ | infixexp XOR infixexp { $$ = boxSeq(boxPar($1,$3),boxPrim2(sigXOR)); }
+
+ | infixexp LSH infixexp { $$ = boxSeq(boxPar($1,$3),boxPrim2(sigLeftShift)); }
+ | infixexp RSH infixexp { $$ = boxSeq(boxPar($1,$3),boxPrim2(sigRightShift)); }
+
+ | infixexp LT infixexp { $$ = boxSeq(boxPar($1,$3),boxPrim2(sigLT)); }
+ | infixexp LE infixexp { $$ = boxSeq(boxPar($1,$3),boxPrim2(sigLE)); }
+ | infixexp GT infixexp { $$ = boxSeq(boxPar($1,$3),boxPrim2(sigGT)); }
+ | infixexp GE infixexp { $$ = boxSeq(boxPar($1,$3),boxPrim2(sigGE)); }
+ | infixexp EQ infixexp { $$ = boxSeq(boxPar($1,$3),boxPrim2(sigEQ)); }
+ | infixexp NE infixexp { $$ = boxSeq(boxPar($1,$3),boxPrim2(sigNE)); }
+
+ | infixexp HASH infixexp { $$ = boxSeq(boxPar($1,$3),boxPrim2(sigConcat)); }
+
+ | infixexp LPAR arglist RPAR %prec APPL { $$ = buildBoxAppl($1,$3); }
+ | infixexp LCROC deflist RCROC %prec APPL { $$ = boxModifLocalDef($1,formatDefinitions($3)); }
+
+ | primitive { $$ = $1; }
+ ;
+
+primitive : INT { $$ = boxInt(atoi(yytext)); }
+ | FLOAT { $$ = boxReal(atof(yytext)); }
+
+ | ADD INT { $$ = boxInt (atoi(yytext)); }
+ | ADD FLOAT { $$ = boxReal(atof(yytext)); }
+
+ | SUB INT { $$ = boxInt ( -atoi(yytext) ); }
+ | SUB FLOAT { $$ = boxReal( -atof(yytext) ); }
+
+ | WIRE { $$ = boxWire(); }
+ | CUT { $$ = boxCut(); }
+
+ | MEM { $$ = boxPrim1(sigDelay1); }
+ | PREFIX { $$ = boxPrim2(sigPrefix); }
+
+ | INTCAST { $$ = boxPrim1(sigIntCast); }
+ | FLOATCAST { $$ = boxPrim1(sigFloatCast); }
+
+ | ADD { $$ = boxPrim2(sigAdd); }
+ | SUB { $$ = boxPrim2(sigSub); }
+ | MUL { $$ = boxPrim2(sigMul); }
+ | DIV { $$ = boxPrim2(sigDiv); }
+ | MOD { $$ = boxPrim2(sigRem); }
+ | FDELAY { $$ = boxPrim2(sigFixDelay); }
+
+ | AND { $$ = boxPrim2(sigAND); }
+ | OR { $$ = boxPrim2(sigOR); }
+ | XOR { $$ = boxPrim2(sigXOR); }
+
+ | LSH { $$ = boxPrim2(sigLeftShift); }
+ | RSH { $$ = boxPrim2(sigRightShift); }
+
+ | LT { $$ = boxPrim2(sigLT); }
+ | LE { $$ = boxPrim2(sigLE); }
+ | GT { $$ = boxPrim2(sigGT); }
+ | GE { $$ = boxPrim2(sigGE); }
+ | EQ { $$ = boxPrim2(sigEQ); }
+ | NE { $$ = boxPrim2(sigNE); }
+
+ | ATTACH { $$ = boxPrim2(sigAttach); }
+
+ | ACOS { $$ = gAcosPrim->box(); }
+ | ASIN { $$ = gAsinPrim->box(); }
+ | ATAN { $$ = gAtanPrim->box(); }
+ | ATAN2 { $$ = gAtan2Prim->box(); }
+ | COS { $$ = gCosPrim->box(); }
+ | SIN { $$ = gSinPrim->box(); }
+ | TAN { $$ = gTanPrim->box(); }
+
+ | EXP { $$ = gExpPrim->box(); }
+ | LOG { $$ = gLogPrim->box(); }
+ | LOG10 { $$ = gLog10Prim->box(); }
+ | POWOP { $$ = gPowPrim->box(); }
+ | POWFUN { $$ = gPowPrim->box(); }
+ | SQRT { $$ = gSqrtPrim->box(); }
+
+ | ABS { $$ = gAbsPrim->box(); }
+ | MIN { $$ = gMinPrim->box(); }
+ | MAX { $$ = gMaxPrim->box(); }
+
+ | FMOD { $$ = gFmodPrim->box(); }
+ | REMAINDER { $$ = gRemainderPrim->box(); }
+
+ | FLOOR { $$ = gFloorPrim->box(); }
+ | CEIL { $$ = gCeilPrim->box(); }
+ | RINT { $$ = gRintPrim->box(); }
+
+
+ | RDTBL { $$ = boxPrim3(sigReadOnlyTable); }
+ | RWTBL { $$ = boxPrim5(sigWriteReadTable); }
+
+ | SELECT2 { $$ = boxPrim3(sigSelect2); }
+ | SELECT3 { $$ = boxPrim4(sigSelect3); }
+
+ | VECTORIZE { $$ = boxPrim2(sigVectorize); }
+ | SERIALIZE { $$ = boxPrim1(sigSerialize); }
+ | HASH { $$ = boxPrim2(sigConcat); }
+
+ | UPSAMPLE { $$ = boxPrim2(sigUpSample); }
+ | DOWNSAMPLE { $$ = boxPrim2(sigDownSample); }
+
+ | LCROC RCROC { $$ = boxPrim2(sigVectorAt); }
+ | LCROC infixexp RCROC { $$ = boxSeq(boxPar(boxWire(),$2),boxPrim2(sigVectorAt)); }
+
+ | ident { $$ = $1; }
+ | SUB ident { $$ = boxSeq(boxPar(boxInt(0),$2),boxPrim2(sigSub)); }
+
+ | LPAR expression RPAR { $$ = $2; }
+ | LAMBDA LPAR params RPAR DOT LPAR expression RPAR
+ { $$ = buildBoxAbstr($3,$7); }
+
+ | CASE LBRAQ rulelist RBRAQ { $$ = boxCase(checkRulelist($3)); }
+
+ | ffunction { $$ = boxFFun($1); }
+ | fconst { $$ = $1; }
+ | fvariable { $$ = $1; }
+ | COMPONENT LPAR uqstring RPAR { $$ = boxComponent($3); }
+ | LIBRARY LPAR uqstring RPAR { $$ = boxLibrary($3); }
+ | ENVIRONMENT LBRAQ deflist RBRAQ { $$ = boxWithLocalDef(boxEnvironment(),formatDefinitions($3)); }
+
+ | button { $$ = $1; }
+ | checkbox { $$ = $1; }
+ | vslider { $$ = $1; }
+ | hslider { $$ = $1; }
+ | nentry { $$ = $1; }
+ | vgroup { $$ = $1; }
+ | hgroup { $$ = $1; }
+ | tgroup { $$ = $1; }
+ | vbargraph { $$ = $1; }
+ | hbargraph { $$ = $1; }
+
+ | fpar { $$ = $1; }
+ | fseq { $$ = $1; }
+ | fsum { $$ = $1; }
+ | fprod { $$ = $1; }
+ ;
+
+
+ident : IDENT { $$ = boxIdent(yytext); }
+ ;
+
+name : IDENT { $$ = tree(yytext); }
+ ;
+
+
+
+arglist : argument { $$ = cons($1,nil); }
+ | arglist PAR argument { $$ = cons($3,$1); }
+ ;
+
+argument : argument SEQ argument { $$ = boxSeq($1,$3); }
+ | argument SPLIT argument { $$ = boxSplit($1,$3); }
+ | argument MIX argument { $$ = boxMerge($1,$3); }
+ | argument REC argument { $$ = boxRec($1,$3); }
+ | infixexp { $$ = $1; }
+ ;
+
+string : STRING { $$ = tree(yytext); }
+ ;
+
+uqstring : STRING { $$ = unquote(yytext); }
+ ;
+
+fstring : STRING { $$ = tree(yytext); }
+ | FSTRING { $$ = tree(yytext); }
+ ;
+
+/* description of iterative expressions */
+
+fpar : IPAR LPAR ident PAR argument PAR expression RPAR
+ { $$ = boxIPar($3,$5,$7); }
+ ;
+
+fseq : ISEQ LPAR ident PAR argument PAR expression RPAR
+ { $$ = boxISeq($3,$5,$7); }
+ ;
+
+fsum : ISUM LPAR ident PAR argument PAR expression RPAR
+ { $$ = boxISum($3,$5,$7); }
+ ;
+
+fprod : IPROD LPAR ident PAR argument PAR expression RPAR
+ { $$ = boxIProd($3,$5,$7); }
+ ;
+
+
+/* description of foreign functions */
+
+ffunction : FFUNCTION LPAR signature PAR fstring PAR string RPAR
+ { $$ = ffunction($3,$5,$7); }
+ ;
+
+fconst : FCONSTANT LPAR type name PAR fstring RPAR
+ { $$ = boxFConst($3,$4,$6); }
+
+fvariable : FVARIABLE LPAR type name PAR fstring RPAR
+ { $$ = boxFVar($3,$4,$6); }
+ ;
+
+/* Description of user interface building blocks */
+button : BUTTON LPAR uqstring RPAR { $$ = boxButton($3); }
+ ;
+
+checkbox : CHECKBOX LPAR uqstring RPAR { $$ = boxCheckbox($3); }
+ ;
+
+vslider : VSLIDER LPAR uqstring PAR argument PAR argument PAR argument PAR argument RPAR
+ { $$ = boxVSlider($3,$5,$7,$9,$11); }
+ ;
+hslider : HSLIDER LPAR uqstring PAR argument PAR argument PAR argument PAR argument RPAR
+ { $$ = boxHSlider($3,$5,$7,$9,$11); }
+ ;
+nentry : NENTRY LPAR uqstring PAR argument PAR argument PAR argument PAR argument RPAR
+ { $$ = boxNumEntry($3,$5,$7,$9,$11); }
+ ;
+vgroup : VGROUP LPAR uqstring PAR expression RPAR
+ { $$ = boxVGroup($3, $5); }
+ ;
+hgroup : HGROUP LPAR uqstring PAR expression RPAR
+ { $$ = boxHGroup($3, $5); }
+ ;
+tgroup : TGROUP LPAR uqstring PAR expression RPAR
+ { $$ = boxTGroup($3, $5); }
+ ;
+
+vbargraph : VBARGRAPH LPAR uqstring PAR argument PAR argument RPAR
+ { $$ = boxVBargraph($3,$5,$7); }
+ ;
+hbargraph : HBARGRAPH LPAR uqstring PAR argument PAR argument RPAR
+ { $$ = boxHBargraph($3,$5,$7); }
+ ;
+
+/* Description of foreign functions */
+
+signature : type fun LPAR typelist RPAR { $$ = cons($1, cons($2, $4)); }
+ | type fun LPAR RPAR { $$ = cons($1, cons($2, nil)); }
+ ;
+
+fun : IDENT { $$ = tree(yytext); }
+ ;
+
+typelist : type { $$ = cons($1,nil); }
+ | typelist PAR type { $$ = cons($3,$1); }
+ ;
+
+rulelist : rule { $$ = cons($1,nil); }
+ | rulelist rule { $$ = cons($2,$1); }
+ ;
+
+rule : LPAR arglist RPAR ARROW expression ENDDEF
+ { $$ = cons($2,$5); }
+ ;
+
+type : INTCAST { $$ = tree(0); }
+ | FLOATCAST { $$ = tree(1); }
+ ;
+
+%%
+