#ifndef _MUSIC_PARSER_HPP_ #define _MUSIC_PARSER_HPP_ #ifndef _COMMON_SMARTPOINTER_HPP_ #include #endif #ifndef _MUSIC_NOTE_HPP_ #include #endif #ifndef _MUSIC_CHORD_HPP_ #include #endif #ifndef _MUSIC_EMITTER_HPP_ #include #endif #ifndef _MUSIC_SCANSYMBOLS_HPP_ #include #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 &symbols); void removeSymbols(ScanSymbols::ScanSymbol symbol); void removeSymbols(Block &symbols); bool symbolIn(Block &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 ¬e); bool isMinor(void)const; Block mNoteSymbols; Block mSharpFlatSymbols; Block mSymbols; SmartPointer 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