Music notation
This commit is contained in:
1 parent
3db0562eb6
commit
1c3deef71e
4 files changed
+252
No files matched your search
Executable
+5
@@ -0,0 +1,5 @@
|
||||
#!/bin/bash
|
||||
|
||||
bison -dv parser.y | echo 'bison'
|
||||
flex lexer.l | echo 'flex'
|
||||
g++ parser.tab.c lex.yy.c -lfl -o parser | echo 'kompilacja'
|
||||
@@ -0,0 +1,50 @@
|
||||
%{
|
||||
#include <iostream>
|
||||
|
||||
using namespace std;
|
||||
|
||||
#define YY_DECL extern "C" int yylex()
|
||||
int line = 1;
|
||||
|
||||
#include "parser.tab.h"
|
||||
%}
|
||||
|
||||
%%
|
||||
|
||||
[ \t] ;
|
||||
\n { line++; }
|
||||
|
||||
alias { return ALIAS; }
|
||||
verse { return VERSE; }
|
||||
ending { return ENDING; }
|
||||
repeat { return REPEAT; }
|
||||
|
||||
K:[GF] { return KEY; }
|
||||
S:[ABCDEFG](dur|mol) { return SCALE; }
|
||||
|
||||
M:[1-8]\/[1248] { return METER; }
|
||||
T: { return TEMPO; }
|
||||
|
||||
\- { return FLAT; }
|
||||
\+ { return SHARP; }
|
||||
~ { return NATURAL; }
|
||||
_ { return PAUSE; }
|
||||
[abcdefg][01234] { return PITCH; }
|
||||
\. { return DOT; }
|
||||
\| { return BAR; }
|
||||
\|\| { return PHRASE; }
|
||||
\|: { return REPEAT_BEG; }
|
||||
:\| { return REPEAT_END; }
|
||||
\{ { return LINE_BEG; }
|
||||
\} { return LINE_END; }
|
||||
|
||||
: { return COLON; }
|
||||
, { return COMMA; }
|
||||
|
||||
[0-9]+ { yylval.num = atoi(yytext);
|
||||
return NUMBER; }
|
||||
[_a-zA-Z]+[_\-a-zA-Z0-9]* { yylval.num = atoi(yytext);
|
||||
return STRING; }
|
||||
|
||||
%%
|
||||
|
||||
@@ -0,0 +1,185 @@
|
||||
%{
|
||||
#include <cstdio>
|
||||
#include <iostream>
|
||||
using namespace std;
|
||||
|
||||
extern "C" int yylex();
|
||||
extern "C" int yyparse();
|
||||
extern "C" FILE *yyin;
|
||||
extern "C" char *yytext;
|
||||
extern int line;
|
||||
|
||||
void yyerror(const char *s);
|
||||
%}
|
||||
|
||||
%union {
|
||||
int num;
|
||||
char*str;
|
||||
}
|
||||
|
||||
%token ALIAS VERSE ENDING REPEAT
|
||||
|
||||
%token KEY SCALE
|
||||
|
||||
%token METER TEMPO
|
||||
|
||||
%token FLAT SHARP NATURAL PAUSE PITCH DOT BAR PHRASE REPEAT_BEG REPEAT_END LINE_BEG LINE_END
|
||||
|
||||
%token COLON COMMA
|
||||
|
||||
%token <num> NUMBER
|
||||
%token <str> STRING
|
||||
|
||||
%%
|
||||
|
||||
file:
|
||||
alias line { cout << "Plik "<< yytext << endl; }
|
||||
;
|
||||
|
||||
alias:
|
||||
alias ALIAS STRING chord { cout << "Alias "<< yytext << endl; }
|
||||
| ALIAS STRING chord { cout << "Alias "<< yytext << endl; }
|
||||
;
|
||||
|
||||
line:
|
||||
LINE_BEG line_inside LINE_END { cout << "Linia "<< yytext << endl; }
|
||||
;
|
||||
|
||||
line_inside:
|
||||
line_info verse string { cout << "Wnętrze linii "<< yytext << endl; }
|
||||
| line_info verse { cout << "Wnętrze linii "<< yytext << endl; }
|
||||
;
|
||||
|
||||
line_info:
|
||||
KEY SCALE { cout << "Klucz i skala "<< yytext << endl; }
|
||||
| KEY { cout << "Klucz "<< yytext << endl; }
|
||||
;
|
||||
|
||||
verse:
|
||||
verse verse_inside
|
||||
| verse_inside { cout << "Część "<< yytext << endl; }
|
||||
;
|
||||
|
||||
verse_inside:
|
||||
verse_declaration path { cout << "Wnętrze części "<< yytext << endl; }
|
||||
;
|
||||
|
||||
verse_declaration:
|
||||
VERSE STRING { cout << "Deklaracja części "<< yytext << endl; }
|
||||
;
|
||||
|
||||
string:
|
||||
string STRING
|
||||
| STRING { cout << "Napis "<< yytext << endl; }
|
||||
;
|
||||
|
||||
path:
|
||||
path path_inside
|
||||
| path_inside { cout << "Ścieżka "<< yytext << endl; }
|
||||
;
|
||||
|
||||
path_inside:
|
||||
phrase { cout << "Wnętrze ścieżki "<< yytext << endl; }
|
||||
| repeat { cout << "Wnętrze ścieżki "<< yytext << endl; }
|
||||
;
|
||||
|
||||
phrase:
|
||||
PHRASE bar_group PHRASE { cout << "Fraza "<< yytext << endl; }
|
||||
;
|
||||
|
||||
repeat:
|
||||
repeat_inside repeat_number ending_bar { cout << "Fraza powtarzana z taktem końcowym "<< yytext << endl; }
|
||||
| repeat_inside repeat_number { cout << "Fraza powtarzana "<< yytext << endl; }
|
||||
;
|
||||
|
||||
repeat_inside:
|
||||
REPEAT_BEG bar_group ending_bar REPEAT_END { cout << "Wnętrze frazy "<< yytext << endl; }
|
||||
| REPEAT_BEG bar_group REPEAT_END { cout << "Wnętrze frazy "<< yytext << endl; }
|
||||
;
|
||||
|
||||
repeat_number:
|
||||
REPEAT NUMBER { cout << "Powtarzanie "<< yytext << endl; }
|
||||
;
|
||||
|
||||
bar_group:
|
||||
bar bar_group
|
||||
| bar { cout << "Takty "<< yytext << endl; }
|
||||
;
|
||||
|
||||
ending_bar:
|
||||
ending bar { cout << "Takt końcowy "<< yytext << endl; }
|
||||
;
|
||||
|
||||
ending:
|
||||
ending COMMA NUMBER
|
||||
| ENDING NUMBER { cout << "Zakończenie "<< yytext << endl; }
|
||||
;
|
||||
|
||||
bar:
|
||||
bar_inside BAR { cout << "Takt "<< yytext << endl; }
|
||||
| bar_inside { cout << "Takt "<< yytext << endl; }
|
||||
;
|
||||
|
||||
bar_inside:
|
||||
bar_info sound_group { cout << "\tWnętrze taktu "<< yytext << endl; }
|
||||
| sound_group { cout << "\tWnętrze taktu "<< yytext << endl; }
|
||||
;
|
||||
|
||||
bar_info:
|
||||
METER TEMPO NUMBER { cout << "\t\tMetrum i tempo "<< yytext << endl; }
|
||||
;
|
||||
|
||||
sound_group:
|
||||
sound_group COMMA sound
|
||||
| sound { cout << "\t\tDźwięki "<< yytext << endl; }
|
||||
;
|
||||
|
||||
sound:
|
||||
note COLON NUMBER DOT { cout << "\t\tDźwięk "<< yytext << endl; }
|
||||
| note COLON NUMBER { cout << "\t\tDźwięk "<< yytext << endl; }
|
||||
;
|
||||
|
||||
note:
|
||||
tone { cout << "\t\tNuta "<< yytext << endl; }
|
||||
| chord { cout << "\t\tAkord "<< yytext << endl; }
|
||||
| STRING { cout << "\t\tMakro "<< yytext << endl; }
|
||||
| PAUSE { cout << "\t\tPauza "<< yytext << endl; }
|
||||
;
|
||||
|
||||
chord:
|
||||
tone COMMA chord
|
||||
| tone COMMA tone { cout << "\t\t\tChwyt "<< yytext << endl; }
|
||||
;
|
||||
|
||||
tone:
|
||||
symbol PITCH { cout << "\t\t\t\tWysokość "<< yytext << endl; }
|
||||
| PITCH { cout << "\t\t\t\tWysokość "<< yytext << endl; }
|
||||
;
|
||||
|
||||
symbol:
|
||||
FLAT { cout << "\t\t\t\tBemol "<< yytext << endl; }
|
||||
| SHARP { cout << "\t\t\t\tKrzyżyk "<< yytext << endl; }
|
||||
| NATURAL { cout << "\t\t\t\tKasownik "<< yytext << endl; }
|
||||
;
|
||||
|
||||
%%
|
||||
|
||||
int main(int argc, char* args[]) {
|
||||
FILE *f = fopen(args[1], "r");
|
||||
if (!f) {
|
||||
cerr << "fopen error " << endl ;
|
||||
return -1;
|
||||
}
|
||||
|
||||
yyin = f;
|
||||
|
||||
do {
|
||||
yyparse();
|
||||
} while (!feof(yyin));
|
||||
|
||||
}
|
||||
|
||||
void yyerror(const char *s) {
|
||||
cout << "line " << line << ": " << yytext << ", " << s << endl;
|
||||
exit(-1);
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
alias C-Dur c2,e2,g2,c3,e3
|
||||
alias A-Mol a2,e2,a3,c3,e3
|
||||
|
||||
{
|
||||
K:G
|
||||
S:Cdur
|
||||
|
||||
verse Zwrotka
|
||||
|
||||
|: M:3/4 T:120 a2,e2:4., c2:8, d2:8, e2:8 | C-Dur:4, _:8, e2:8, d2:8, c2:8 :| repeat 2
|
||||
|| A-Mol:4, _:4, a2:8, a2:8 | c2:8, _:8, c2,e2:8, _:8, C-Dur:4 ||
|
||||
}
|
||||
Reference in new issue
Block a user