mc-lang 1 20190908
- mc-lang全般に含まれているリソースまとめです。
- https://github.com/task4233/mc-lang-1
追加した仕様
#
でコメントアウト - カッコの実装
- 二項演算(+,-,*,/)の実yo
lexer.h
- 字句解析用ヘッダ
- このセクションでは、Lexerというテキストから「数字」や「演算子」をまとまり毎に分割するクラスを実装している。
- 全体的な流れとしては、gettokをParserから呼ぶことにより「次のトークン」を読み、それが数値リテラルだった場合はnumValという変数にセットする。
variables
名称 | 詳細 |
tok_eof | EOFトークン(-1) |
tok_number | 値を格納 |
functions
class
Lexer
Public
- gettok()メソッド
- getNumVal
- setNumVal
- initStream
Private
parser.h
- 構文解析用ヘッダ
- ここのセクションでは、AST(構文解析木)の葉を定義している。
- MCコンパイラの根幹であるクラスでLexerとCodeGenで使われている。
- Lexerが次のトークンを取ってきて、それが数値リテラルであったらNumberASTに値を格納し、そのポインタを親ノードが保持する。
- 全てのコードを無事にASTとして表現できたら、後述するcodegenを再帰的に呼び出す事によりオブジェクトファイルを生成する。
variables
- curTok
- getNextToken
- BinopPrecedence
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
public
private
BinaryAST
public
private
- Op
- LHS(Left-hand side)/RHS(Right-hand side)
PrototypeAST
- 関数シグネチャーで、関数の名前と引数の名前を表すクラス
public
private
- Name
- Args
- 引数
- std::vector<std::string>
FunctionAST
- 関数のbody(C++で言うint foo) {...}の中身)を表すクラス
public
private
- Proto
- 関数の名前と引数を保持するオブジェクトのゆにぽ
- std::unique_ptr<PrototypeAST>
- Body
- 関数の中身のexpressionを保持するオブジェクトのゆにぽ
- std::unique_ptr<ExprAST>