flower-1.0.2
[lilypond.git] / lexer.l
bloba0da226a995ebd6ac9bf594a435ec280597812ad
1 %{ // -*-Fundamental-*-
3 #include <fstream.h>
4 #include <stdio.h>
5 #include "glob.hh"
6 #include "string.hh"
8 #include "lexer.hh"
9 #include "keyword.hh"
10 #include "vray.hh"
11 #include "parser.hh"
12 #include "debug.hh"
14 sstack<istream *> include_stack;
15 static int last_print;
16 const int DOTPRINT=50; // every 50 lines dots
19 %option c++
20 %option noyywrap
21 %option nodefault
22 %option yylineno
23 %option debug
24 %x notes
25 %x incl
26 %x quote
28 OPTSIGN         !?
29 NOTENAMEI       A|B|C|D|E|F|G|As|Bes|Ces|Des|Es|Fes|Ges|Ais|Bis|Cis|Dis|Eis|Fis|Gis
30 NOTENAMEII      a|b|c|d|e|f|g|as|bes|ces|des|es|fes|ges|ais|bis|cis|dis|eis|fis|gis
31 NOTENAMEIII      Ases|Beses|Ceses|Deses|Eses|Feses|Geses|Aisis|Bisis|Cisis|Disis|Eisis|Fisis|Gisis
32 NOTENAMEIIII      ases|beses|ceses|deses|eses|feses|geses|aisis|bisis|cisis|disis|eisis|fisis|gisis
33 RESTNAME        r|s
34 NOTENAME        {NOTENAMEI}|{NOTENAMEII}|{NOTENAMEIII}|{NOTENAMEIIII}
35 PITCH           ['`]*{OPTSIGN}{NOTENAME}
36 DURNAME         1|2|4|8|16|32
37 DURATION        {DURNAME}\.*
38 FULLNOTE        {PITCH}{DURATION}?
39 WORD            [a-zA-Z]+
40 REAL            [0-9]+(\.[0-9]*)?
44 \$              {
45         BEGIN(notes); return '$';
48 <notes>{RESTNAME}       {
49         const char *s = YYText();
50         yylval.string = new String (s); 
51         mtor << "rest:"<< yylval.string;
52         return RESTNAME;
54 <notes>{PITCH}  {
55         const char *s = YYText();
56         yylval.string = new String (s);
57         mtor << "pitch:"<< *yylval.string;
58         return PITCH;
60 <notes>{DURATION}       {
61         yylval.string = new String (YYText());
62         return DURATION;
64 <notes>[:space:]+               {
66 <notes>[ \t\n]+         {
68 <notes>%.*              {
71 <notes>\$       {
72         BEGIN(INITIAL); return '$';
74 <notes>.        {
75         error("lexer error: illegal character found: " + String(YYText()));
78 \"              {
79         BEGIN(quote);
81 <quote>[^\"]*   {
82         yylval.string = new String (YYText());
84 <quote>\"       {
85         BEGIN(INITIAL);
86         return STRING;
89 <<EOF>> {
90         if(!close_input())
91                 yyterminate();
93 {WORD}          {
94         int l = lookup_keyword(YYText());
95         if (l == -1){
96             yylval.id = lookup_identifier(YYText());
97             return IDENTIFIER;
98         } else
99             return l;
102 {REAL}          {
103         Real r;
104         int cnv=sscanf (YYText(), "%lf", &r);
105         assert(cnv == 1);
106         mtor  << "token (REAL)" << r;
107         yylval.real = r;
108         return REAL;
111 [\{\}\[\]\(\)]  {
113         mtor << "parens\n";
114         return YYText()[0];
116 [ \t\n]+        {
117         
119 %.*             {
120         //ignore
122 .               {
123         error("lexer error: illegal character '"+String(YYText()[0])+
124           "' encountered");
125         return YYText()[0];
130 yyFlexLexer *lexer=0;
132 // set the  new input to s, remember old file.
133 void
134 new_input(String s)
135 {    
136     istream *newin ;
137     
138     if (s=="")
139         newin = &cin;
140     else
141         newin = new ifstream( s ); //
142     
143    if ( ! *newin)
144       error("cant open "  + s);
145    cout << "["<<s<<flush;
146    
147    include_stack.push(newin);
149    if (!lexer) {
150        lexer = new yyFlexLexer;
151        lexer->set_debug( !monitor.silence("Lexer"));
152    }            
153    
154    lexer->switch_streams(newin);
158 // pop the inputstack.
159 bool
160 close_input()
163   istream *closing= include_stack.pop();
164   if (closing != &cin)
165       delete closing;
166   
167   cout << "]" << flush;
168   
169   if (include_stack.empty())
170       return false ;  
171   else 
172       lexer->switch_streams(include_stack.top());  
173   return true;  
177 yylex() {
178         return lexer->yylex();
181 void
182 yyerror(char *s)
184   *mlog << "error in line " << lexer->lineno() <<  ": " << s << '\n';
185   exit(1);
189 #if 0
191 <notes>{NOTENAME}       {
192         yylval.string = new String (YYText());
193         return NOTENAME;
196 #endif