+/* -*- Mode: C++; tab-width: 4; c-basic-offset: 4 -*- */
+
+/* Scanner for the Faust language */
+
+%{
+#include "tree.hh"
+#include "faustparser.hpp"
+#define YY_NO_UNISTD_H 1
+extern int isatty (int );
+%}
+
+DIGIT [0-9]
+ID [a-zA-Z][_a-zA-Z0-9]*
+LETTER [a-zA-Z]
+NUMBER ({DIGIT}+"."{DIGIT}*|"."{DIGIT}+|{DIGIT}+)
+WSPACE [ \t\n]
+TMACRO \\{ID}(\[(\ *({ID}|{NUMBER}),?\ *)\])?(\{(\ *({ID}|{NUMBER}),?\ *)*\})*
+
+%option yylineno
+%x comment
+%x doc
+%x lst
+
+
+%%
+
+
+"/*" BEGIN(comment);
+<comment>[^*\x0a\x0d]* /* eat anything that's not a '*' */
+<comment>"*"+[^*/\x0a\x0d]* /* eat up '*'s not followed by '/'s */
+<comment>\x0a\x0d /* no need to increment yylineno here */
+<comment>\x0a /* no need to increment yylineno here */
+<comment>\x0d /* no need to increment yylineno here */
+<comment>"*"+"/" BEGIN(INITIAL);
+
+"<mdoc>" { BEGIN(doc); return BDOC; }
+<doc>. return DOCCHAR; /* char by char, may be slow ?? */
+<doc>\n return DOCCHAR; /* keep newline chars */
+<doc>"<notice/>" return NOTICE; /* autoclosing tag */
+<doc>"<notice />" return NOTICE; /* autoclosing tag */
+<doc>"<listing" { BEGIN(lst); return BLST; } /* autoclosing tag */
+<doc>"<equation>" { BEGIN(INITIAL); return BEQN; }
+"</equation>" { BEGIN(doc); return EEQN; }
+<doc>"<diagram>" { BEGIN(INITIAL); return BDGM; }
+"</diagram>" { BEGIN(doc); return EDGM; }
+<doc>"<metadata>" { BEGIN(INITIAL); return BMETADATA; }
+"</metadata>" { BEGIN(doc); return EMETADATA; }
+<doc>"</mdoc>" { BEGIN(INITIAL); return EDOC; }
+
+<lst>"true" return LSTTRUE;
+<lst>"false" return LSTFALSE;
+<lst>"dependencies" return LSTDEPENDENCIES;
+<lst>"mdoctags" return LSTMDOCTAGS;
+<lst>"distributed" return LSTDISTRIBUTED;
+<lst>"=" return LSTEQ;
+<lst>"\"" return LSTQ;
+<lst>"/>" { BEGIN(doc); return ELST; }
+
+
+{DIGIT}+ return INT;
+
+
+{DIGIT}+"."{DIGIT}* return FLOAT;
+{DIGIT}+"."{DIGIT}*e[-+]?{DIGIT}+ return FLOAT;
+{DIGIT}+e[-+]?{DIGIT}+ return FLOAT;
+"."{DIGIT}+ return FLOAT;
+"."{DIGIT}+e[-+]?{DIGIT}+ return FLOAT;
+
+
+":" return SEQ;
+"," return PAR;
+"<:" return SPLIT;
+"+>" return MIX;
+":>" return MIX;
+"~" return REC;
+
+"+" return ADD;
+"-" return SUB;
+"*" return MUL;
+"/" return DIV;
+"%" return MOD;
+"@" return FDELAY;
+"'" return DELAY1;
+
+"&" return AND;
+"|" return OR;
+"xor" return XOR;
+
+"<<" return LSH;
+">>" return RSH;
+
+"<" return LT;
+"<=" return LE;
+">" return GT;
+">=" return GE;
+"==" return EQ;
+"!=" return NE;
+
+"_" return WIRE;
+"!" return CUT;
+
+";" return ENDDEF;
+"=" return DEF;
+"(" return LPAR;
+")" return RPAR;
+"{" return LBRAQ;
+"}" return RBRAQ;
+"[" return LCROC;
+"]" return RCROC;
+
+"\\" return LAMBDA;
+"." return DOT;
+"with" return WITH;
+
+"mem" return MEM;
+"prefix" return PREFIX;
+
+"int" return INTCAST;
+"float" return FLOATCAST;
+
+"rdtable" return RDTBL;
+"rwtable" return RWTBL;
+
+"select2" return SELECT2;
+"select3" return SELECT3;
+
+"ffunction" return FFUNCTION;
+"fconstant" return FCONSTANT;
+"fvariable" return FVARIABLE;
+
+"button" return BUTTON;
+"checkbox" return CHECKBOX;
+"vslider" return VSLIDER;
+"hslider" return HSLIDER;
+"nentry" return NENTRY;
+"vgroup" return VGROUP;
+"hgroup" return HGROUP;
+"tgroup" return TGROUP;
+"vbargraph" return VBARGRAPH;
+"hbargraph" return HBARGRAPH;
+"attach" return ATTACH;
+
+"acos" return ACOS;
+"asin" return ASIN;
+"atan" return ATAN;
+"atan2" return ATAN2;
+
+"cos" return COS;
+"sin" return SIN;
+"tan" return TAN;
+
+"exp" return EXP;
+"log" return LOG;
+"log10" return LOG10;
+"^" return POWOP;
+"pow" return POWFUN;
+"sqrt" return SQRT;
+
+"abs" return ABS;
+"min" return MIN;
+"max" return MAX;
+
+"fmod" return FMOD;
+"remainder" return REMAINDER;
+
+"floor" return FLOOR;
+"ceil" return CEIL;
+"rint" return RINT;
+
+"seq" return ISEQ;
+"par" return IPAR;
+"sum" return ISUM;
+"prod" return IPROD;
+
+"import" return IMPORT;
+"component" return COMPONENT;
+"library" return LIBRARY;
+"environment" return ENVIRONMENT;
+
+"declare" return DECLARE;
+
+"serialize" return SERIALIZE;
+"vectorize" return VECTORIZE;
+"#" return HASH;
+"rate" return RATE;
+
+"up" return UPSAMPLE;
+"down" return DOWNSAMPLE;
+
+"case" return CASE;
+"=>" return ARROW;
+
+_{ID} return IDENT;
+{ID} return IDENT;
+
+"\""[^\"]*"\"" return STRING;
+
+"<"{LETTER}*"."{LETTER}">" return FSTRING;
+"<"{LETTER}*">" return FSTRING;
+
+
+"//"[^\x0a\x0d]* /* eat up one-line comments */
+
+[ \t\x0a\x0d]+ /* eat up whitespace */
+
+<<EOF>> yyterminate();
+
+. printf("extra text is : %s\n", yytext); return EXTRA;
+
+
+%%
+int yywrap() { return 1; }
+