IParser

パーサーの基底クラス

パーサーオブジェクトに1バイトずつ電文を投入することで、電文系列を解釈する状態遷移マシンです。

メソッド

Parse(), operator << ()

IParser& Parse(uint8_t u8b)
IParser& operator << (char_t c)

パーサーに1バイト入力します。入力のたびにパーサーの状態が変化し、パーサーの解釈が完了するとstate()E_TWESERCMD_COMPLETEに変化し解釈完了状態となります。

state()

uint8_t state()

パーサーの状態を取得します。

operator bool(), is_complete()

operator bool()
bool is_complete()

パーサーの状態がE_TWESERCMD_COMPLETEの場合trueになります。

length()

uint16_t length()

パーサーで解釈済みのバイト列のデータ長を返します。

operator[]()

uint8_t operator[](int i)

パーサーの解釈済みのバイト列にアクセスします。

get_payload()

SmplBuf_Byte& get_payload()

パーサーの解釈済みのバイト列を格納した配列クラスSmplBuf_Byteを参照します。

set_payload()

template <typename T>
inline void set_payload(T& bobj)

inline void set_payload(uint8_t *b, uint8_t *e)

//例: buffに出力書式を格納する
AsciiParser format_ascii; // パーサー(出力用)
SmplBuf_ByteSL<256> buff; // 出力バッファ
uint8_t buff_raw[] = "ABCDE"; // データ列

format_ascii.set_payload(buff_raw, buff_raw + sizeof(buff_raw));

buff << format_ascii;
for(auto x : buff) putchar(x);

パーサーオブジェクトを用いて出力を構築する際に、データ列をコピーします。コピー元はSmplBuf_Byteデータ構造またはuint8_t*型の先頭と終端+1ポインタの組み合わせです。

reinit()

virtual void reinit()

パーサーの解釈途中の内容を破棄し、新たな解釈を始めます。

operator << ()

IStreamOut& operator << (TWE::IStreamOut& lhs, IParser& rhs)
IStreamOut& operator << (TWETERM::ITerm& lhs, IParser& rhs)

IStreamOutをベースクラスにもつストリームオブジェクトに、書式出力します。

メソッド

_u8Parse()

virtual uint8_t _u8Parse(char_t u8b) = 0

1バイト入力して解釈を進める仮想関数です。派生クラスにより実装されます。

_vOutput()

virtual inline void _vOutput(SmplBuf_Byte& bobj, IStreamOut& p) = 0

バイト配列bobjに格納されるバイト列に対応する書式をストリームpに出力する仮想関数です。派生クラスにより実装されます。

状態

状態名

状態

E_TWESERCMD_EMPTY

0

解釈前で、まだ系列のヘッダも認識できていない

1..0x7F

解釈中

E_TWESERCMD_COMPLETE

0x80

系列が正しく解釈できた

E_TWESERCMD_ERROR

0x81

系列の解釈にエラーがあった

E_TWESERCMD_CHECKSUM_ERROR

0x82

系列は得られたがチェックサムエラーだった

最終更新