Skip to content

Commit

Permalink
Update parse_one spec.
Browse files Browse the repository at this point in the history
  • Loading branch information
karino2 committed Feb 1, 2019
1 parent 6bec4df commit 60f36a7
Showing 1 changed file with 26 additions and 4 deletions.
30 changes: 26 additions & 4 deletions arm_asm.md
Original file line number Diff line number Diff line change
Expand Up @@ -2600,20 +2600,42 @@ sub.len = 4;
第一回のパーサーとだいたい似たような形になりますが、文字列を渡すので一文字先読みした分の処理を考える必要は無いでしょうね。

パーサーとしてはどこまで読んだのか、と、読んだ結果のtokenを返す事になります。
先頭のトークンとして来る可能性があるのは、

1. ニモニックや疑似命令
2. ラベル
3. コメント
4. 空白

くらいですかね。

当初はToken的な構造体を返せばいいかと思ったけど、ラベルというのがちょっと特殊で次まで読んでみないと分からない。
例えば最初がmovで始まっていても、 mov:だったらラベルになります。

という事でparse_oneとしては、

1. 文字の単語
2. コロン
3. 何も無し

の三つくらいを返す事になりそう。
何も無しというのは空白だけで最後まで行ってしまった場合です。

コロンは所詮一文字なので、わざわざenumを作るのも大げさな気がします。

という事で関数のシグニチャとしては、以下としますか。

```
int parse_one(char *str, struct Token* out_token);
int parse_one(char *str, struct Substring* out_subs);
```

でどこまで読んだかをreturnし、エラーだったらマイナスの何かの値としますか。
どこまで読んだかをreturnし、エラーだったらマイナスの何かの値としますか。

まずは最初の単語を切り出す、という事をしましょう。

単語は、ローマ字かアンダースコアで始まり、文字っぽいものでカッコっぽく無い物が続く物。
数字とローマ字とアンダースコアは最低限許容する、くらいにしておきましょう。

parse_oneは改行か単語を返すとします。
単語はとりあえずシンボルという名前にしておきましょう。
先頭の空白は無視する事にします。

### 引数のパース
Expand Down

0 comments on commit 60f36a7

Please sign in to comment.