---
# System prepended metadata

title: mc-lang 1 20190908

---

# mc-lang 1 20190908
 - https://github.com/task4233/mc-lang-1-assignment
 - 以下めもです

# 追加した仕様
 - `#`でコメントアウト
 - カッコの実装
 - 二項演算(+,-,*,/)の実yo

# lexer.h
 - 字句解析用ヘッダ
 - このセクションでは、Lexerというテキストから「数字」や「演算子」をまとまり毎に分割するクラスを実装している。
 - 全体的な流れとしては、gettokをParserから呼ぶことにより「次のトークン」を読み、それが数値リテラルだった場合はnumValという変数にセットする。
## variables
 - Token
   - 構造体

|名称|詳細|
|:-:|:-:|
|tok_eof|EOFトークン(-1)|
|tok_number|値を格納|

## functions
 - getIdentifier()
   - getter

## class
### Lexer
#### Public
 - gettok()メソッド
   - トークンを取得する
   - #やスペース等をスルーする
 - getNumVal
   - numValのゲッター
 - setNumVal
   - numValのセッター
 - initStream
   - fileNameのファイルをopen

#### Private
 - iFile
   - std::ifstream
 - numVal
   - 保持する数字
 - getNextChar
   - 1文字char型で入力

# parser.h
 - 構文解析用ヘッダ
 - ここのセクションでは、AST（構文解析木）の葉を定義している。
 - MCコンパイラの根幹であるクラスでLexerとCodeGenで使われている。
 - Lexerが次のトークンを取ってきて、それが数値リテラルであったらNumberASTに値を格納し、そのポインタを親ノードが保持する。
 - 全てのコードを無事にASTとして表現できたら、後述するcodegenを再帰的に呼び出す事によりオブジェクトファイルを生成する。

## variables
 - curTok
   - 読み取ったトークンを保持
 - getNextToken
   - lexer.hのgettok()
 - BinopPrecedence
   - mc.cppで定義した結合子の優先権を保持
## functions
 - GetTokPrecedence()
   - 二項演算子の結合度を取得
   - もし現在のトークンが二項演算子ならその結合度を返し、そうでないなら-1を返す。
 - LogError(const char *str)
   - エラーを表示しnullptrを返してくれるエラーハンドリング関数
 - ParseExpressions()
   - 数値リテラル/カッコ->二項演算子の順にパースできるかを確認してパースする
 - ParseNumberExpr()
   - 数値リテラルをパースして内部のexpressionのゆにぽを返す関数
 - ParseParenExpr
   - カッコ内部のexpressionをパースして内部のexpressionのゆにぽを返す関数
 - ParsePrimary()
   - NumberASTかカッコをパースするための関数を呼び出す関数
 - ParseBinOpRHS\(int CallerPrec, std::unique_ptr\<ExprAST\> LHS\)
   - 二項演算子をパースする関数
   - LHSが入った状態でよびだされ, LHSとRHSと二項演算子がペアになった状態で返す
 - ParseTopLevelExpr()
   - パーサーのトップレベル関数
   - まだ関数定義は実装しないので、今のmc言語では__anon_exprという関数がトップレベルに作られ、その中に全てのASTが入る

## class
### ExprAST
 - `5+2`や`2*10-2`等のexpressionを表すクラス

### NumberAST
 - `5`や`2`等の数値リテラルを表すクラス
 
#### public
 - *codegenをオーバーライド

#### private
 - Val
   - 数値の値を保持する変数 

### BinaryAST
 - `+`や`*`等の二項演算子を表すクラス
#### public
 - *codegenをオーバーライド

#### private
 - Op
   - char型のオペランド?
 - LHS(Left-hand side)/RHS(Right-hand side)
   - 左辺値/右辺値を指すゆにぽ

### PrototypeAST
 - 関数シグネチャーで、関数の名前と引数の名前を表すクラス
#### public
 - &getName()
   - 保持しているNameのアドレスを返す
#### private
 - Name
   - 関数名
   - std::string
 - Args
   - 引数
   - std::vector\<std::string\>
 
### FunctionAST
 - 関数のbody(C++で言うint foo) {...}の中身)を表すクラス

#### public
 - *codegen()

#### private
 - Proto
   - 関数の名前と引数を保持するオブジェクトのゆにぽ
   - std::unique_ptr\<PrototypeAST\>
 - Body
   - 関数の中身のexpressionを保持するオブジェクトのゆにぽ
   - std::unique_ptr\<ExprAST\>
