# Lexer - Design
## Overview
- LogiCodeのLexerは、ソースコードを解析して、トークンに分解する役割を持つ。
- トークン列はその後のパース処理で利用される。
- 対話型のインタプリタでも利用できるように、tokenizeは一行づつ行われる。
## Purpose
- ソースコードの文字列を解析して、`TokenType`をつけて、`AST`に変換する処理をしやすくする。
- エラーを報告し、トークン化を中断しないようにする。
## Thinks
- バインドするとき以外はoutしか最初にくる文字がない。
つまり、outじゃない時は全てバインドになる。
バインド名のあとは、引数か区切り文字。
`
enum Token {
Keyword(String),
Delimiter(String),
Identifier(String),
Literal(String),
Operator(String),
Comment(String),
}
struct Tokenizer {
inputs: Vec<String>,
tokens: Vec<Vec<Token>>,
}
`
## TokenType
` rust
enum TokenType {
Keyword, // 'input', 'out'
Operator, // 'not', 'or'
Identifier, // 'var', 'fn'
Delimiter // ':'
Literal, //'1', '0'
Comment, // '//'
Error,
}
`
## Struct
` rust
struct Position {
line: u32,
column: u32,
}
struct Token {
token_type: TokenType,
token_data: String,
}
struct Tokenizer {
inputs: Vec<String>,
tokens: Vec<Token>,
position: Position,
}
`
## WorkFlow
input: Vec<String> (行ごとに文字列を分けておく。)
tokenizer = Tokenize::new(input)
tokenizer.tokenize()
tokens: Vec<Token> = tokenizer.get_tokens()