From 60f36a71c51b826fc9d162dc24b9819d2ce688db Mon Sep 17 00:00:00 2001 From: Kazuma Arino Date: Fri, 1 Feb 2019 11:58:04 +0900 Subject: [PATCH] Update parse_one spec. --- arm_asm.md | 30 ++++++++++++++++++++++++++---- 1 file changed, 26 insertions(+), 4 deletions(-) diff --git a/arm_asm.md b/arm_asm.md index 7148e139..80952bdb 100644 --- a/arm_asm.md +++ b/arm_asm.md @@ -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は改行か単語を返すとします。 -単語はとりあえずシンボルという名前にしておきましょう。 先頭の空白は無視する事にします。 ### 引数のパース