> For the complete documentation index, see [llms.txt](https://palscript.twelite.info/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://palscript.twelite.info/master/source-files/mnlib/parsefmt.py.md).

# parseFmt.py parseFmt\_\*.py

TWELITE シリアル書式パーサー

## `class FmtBase`

書式パーサーの基底クラスで共通手続きを定義する。これを継承した FmtAscii (アスキー形式 ASCII形式), FmtBinary (バイナリ形式 Binary形式) を利用する。

書式パーサーは、シリアル入力を想定し、アスキー形式の場合は１行単位でバイナリ形式の場合は１バイト単位で入力系列を解釈し、その系列が書式で定義されるヘッダ、フッタ、チェックサムを満足した時、解釈の完了とし、ヘッダ、フッタを除いた内容（ペイロード）を格納する。

### `process(c)`

入力文字列の解釈を行う。解釈後は  `is_complete()` が `true` を返した場合、解釈が成功し `get_payload()` によりペイロードを得ることができる。ペイロードは続く `process()` 処理などを実行すると内容を保証しないため、解釈終了後に速やかに利用します。

続けて別の系列を解釈したい場合は、そのまま `process()` を実行する。

#### パラメータ

| パラメータ | 内容                                                                                                                                                           |
| ----- | ------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `c`   | 解釈したい入力系列。１バイト単位の解釈と系列単位の解釈の２種類に対応する。１バイト単位の入力では、int型のアスキーコード、str型、bytes型、list型の長さ1の系列。系列単位の入力では list 型、str型、bytes型の１系列を処理する。データに複数系列ある場合や途中で切れている場合は処理できない。 |
|       |                                                                                                                                                              |

#### 戻り値

なし

### `is_comp()`

`process()` 処理後に呼び出し、書式解釈の完了状況を知らせる。true を得た場合は `get_peyload()` または `get_payload_in_str()` メソッドにより、ペイロードを取得する。

{% hint style="info" %}
続く `process()` などの処理により、内部格納されるペイロードは初期化や破壊されるため、速やかにデータをコピーします。
{% endhint %}

#### パラメータ

なし

#### 戻り値

| 値       | 内容                    |
| ------- | --------------------- |
| `true`  | 解釈に成功した。ペイロードが利用できる。  |
| `false` | 解釈に失敗した、または、書式の途中である。 |

### `get_payload()`

ペイロードを返す。

#### パラメータ

なし

#### 戻り値

ヘッダやフッタが含まれないペイロード部を list型 バイト列として返します。

### `reinit()`

明示的に内部を初期状態にします。

#### パラメータ

なし

#### 戻り値

なし

### その他メソッド

内部で利用する目的でいくつかのメソッドが定義されています。詳細はソースコードを参照してください。

### コード例

### 系列単位の解釈

`str` 型の系列 `a` を解釈し、`pay` にペイロード情報保存します。`pay` には `[ 0x78, 0x80, 0x01, ... , 0x00 ]` が格納されます。

```python
import parseFmt_Ascii

fmta=parseFmt_Ascii.FmtAscii()
a = ':7880010F0F0380030002800200DF'
pay = []

fmta.process(a)

if fmta.is_comp():
    pay = fmta.get_payload()

```

１バイト単位の解釈

バイナリの系列 `b` について、１バイトごと `process()` メソッドにより系列の解釈を進めます。終端の `0x04` を投入した時点で、解釈が完了しペイロードが `pay` に保管されます。

```python
import parseFmt_Binary

fmtb=parseFmt_Binary.FmtBinary()
b = [0xA5, 0x5A, 0x80, 0x05, 0x78, 0x00, 0x11, 0x22, 0x33, 0x78, 0x04]
pay = []

for x in b:
  fmtb.process(x)
  
  if fmtb.is_comp():
    pay = fmtb.get_payload()
    break
    
```
