Files
Work/music/parser.hpp
2024-08-07 09:16:27 -04:00

79 lines
1.7 KiB
C++

#ifndef _MUSIC_PARSER_HPP_
#define _MUSIC_PARSER_HPP_
#ifndef _COMMON_SMARTPOINTER_HPP_
#include <common/pointer.hpp>
#endif
#ifndef _MUSIC_NOTE_HPP_
#include <music/note.hpp>
#endif
#ifndef _MUSIC_CHORD_HPP_
#include <music/chord.hpp>
#endif
#ifndef _MUSIC_EMITTER_HPP_
#include <music/emitter.hpp>
#endif
#ifndef _MUSIC_SCANSYMBOLS_HPP_
#include <music/scansymbols.hpp>
#endif
namespace Music
{
class Parser
{
public:
Parser();
virtual ~Parser();
bool parse(Emitter &input,Music::Chord &chord);
private:
bool nextSymbol();
ScanSymbols::ScanSymbol peekSymbol(void);
void insertSymbols(ScanSymbols::ScanSymbol symbol);
void insertSymbols(Block<Byte> &symbols);
void removeSymbols(ScanSymbols::ScanSymbol symbol);
void removeSymbols(Block<Byte> &symbols);
bool symbolIn(Block<Byte> &symbols);
bool symbolIn(Byte &symbol);
bool symbolIn(ScanSymbols::ScanSymbol symbol);
bool checkSymbol(void);
bool expect(ScanSymbols::ScanSymbol symbol);
bool parseNote(void);
bool parseDegree(void);
bool parseAlteration(void);
bool parseMinor(void);
bool parseVerb(void);
bool parseMajorSeventh(void);
bool parseHalfDiminished(void);
bool parseDiminished(void);
bool parseMinorMajor(void);
bool haveNote(const Note &note);
bool isMinor(void)const;
Block<Byte> mNoteSymbols;
Block<Byte> mSharpFlatSymbols;
Block<Byte> mSymbols;
SmartPointer<Emitter> mEmitter;
ScanSymbols::ScanSymbol mKey;
Byte mByteValue;
String mStrValue;
Note mRootNote;
Notes mNotes;
int mIndex;
bool mIsInError;
};
inline
Parser::Parser()
{
mNoteSymbols.insert(&Byte(ScanSymbols::Note1));
mSharpFlatSymbols.insert(&Byte(ScanSymbols::Sharp1));
mSharpFlatSymbols.insert(&Byte(ScanSymbols::Flat1));
}
inline
Parser::~Parser()
{
}
};
#endif