Add lexing support for structs
This commit is contained in:
parent
0ec427252f
commit
5fca72a3f9
@ -14,7 +14,7 @@
|
|||||||
|
|
||||||
BINARY="$(echo $1 | cut -d'.' -f1)"".out"
|
BINARY="$(echo $1 | cut -d'.' -f1)"".out"
|
||||||
|
|
||||||
make clean SRC=$1 && make SRC=$1 && echo ""
|
make clean SRC=$1 ; make SRC=$1 && echo ""
|
||||||
|
|
||||||
$BINARY ; echo "Return value: ""$?"
|
$BINARY ; echo "Return value: ""$?"
|
||||||
|
|
||||||
|
@ -26,6 +26,7 @@ pub enum TypeKind {
|
|||||||
U128,
|
U128,
|
||||||
String,
|
String,
|
||||||
Array(Box<TypeKind>, u64),
|
Array(Box<TypeKind>, u64),
|
||||||
|
Custom(String),
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Debug, Clone)]
|
||||||
@ -157,11 +158,31 @@ pub enum BlockLevelStatement {
|
|||||||
Return(ReturnType, Expression),
|
Return(ReturnType, Expression),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
pub struct TypeDefinition {
|
||||||
|
range: TokenRange,
|
||||||
|
name: String,
|
||||||
|
kind: TypeDefinitionKind,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
pub enum TypeDefinitionKind {
|
||||||
|
Struct(Vec<StructField>),
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
pub struct StructField {
|
||||||
|
name: String,
|
||||||
|
ty: Type,
|
||||||
|
range: TokenRange,
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub enum TopLevelStatement {
|
pub enum TopLevelStatement {
|
||||||
Import(ImportStatement),
|
Import(ImportStatement),
|
||||||
ExternFunction(FunctionSignature),
|
ExternFunction(FunctionSignature),
|
||||||
FunctionDefinition(FunctionDefinition),
|
FunctionDefinition(FunctionDefinition),
|
||||||
|
TypeDefinition(TypeDefinition),
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
|
@ -476,6 +476,12 @@ impl Parse for SetStatement {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl Parse for TypeDefinition {
|
||||||
|
fn parse(stream: TokenStream) -> Result<Self, Error> {
|
||||||
|
todo!()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl Parse for TopLevelStatement {
|
impl Parse for TopLevelStatement {
|
||||||
fn parse(mut stream: TokenStream) -> Result<Self, Error> {
|
fn parse(mut stream: TokenStream) -> Result<Self, Error> {
|
||||||
use TopLevelStatement as Stmt;
|
use TopLevelStatement as Stmt;
|
||||||
|
@ -62,6 +62,7 @@ impl ast::Module {
|
|||||||
};
|
};
|
||||||
functions.push(def);
|
functions.push(def);
|
||||||
}
|
}
|
||||||
|
TypeDefinition(type_definition) => todo!("Add process for type definition"),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -249,6 +250,7 @@ impl From<ast::TypeKind> for mir::TypeKind {
|
|||||||
mir::TypeKind::Array(Box::new(mir::TypeKind::from(*type_kind.clone())), *length)
|
mir::TypeKind::Array(Box::new(mir::TypeKind::from(*type_kind.clone())), *length)
|
||||||
}
|
}
|
||||||
ast::TypeKind::String => mir::TypeKind::StringPtr,
|
ast::TypeKind::String => mir::TypeKind::StringPtr,
|
||||||
|
ast::TypeKind::Custom(_) => todo!("Add processing for custom types"),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -36,6 +36,8 @@ pub enum Token {
|
|||||||
False,
|
False,
|
||||||
/// `extern`
|
/// `extern`
|
||||||
Extern,
|
Extern,
|
||||||
|
/// `struct`
|
||||||
|
Struct,
|
||||||
|
|
||||||
// Symbols
|
// Symbols
|
||||||
/// `;`
|
/// `;`
|
||||||
@ -74,6 +76,8 @@ pub enum Token {
|
|||||||
BracketClose,
|
BracketClose,
|
||||||
/// `,`
|
/// `,`
|
||||||
Comma,
|
Comma,
|
||||||
|
/// `.`
|
||||||
|
Dot,
|
||||||
|
|
||||||
Eof,
|
Eof,
|
||||||
}
|
}
|
||||||
@ -211,6 +215,7 @@ pub fn tokenize<T: Into<String>>(to_tokenize: T) -> Result<Vec<FullToken>, Error
|
|||||||
"false" => Token::False,
|
"false" => Token::False,
|
||||||
"extern" => Token::Extern,
|
"extern" => Token::Extern,
|
||||||
"pub" => Token::PubKeyword,
|
"pub" => Token::PubKeyword,
|
||||||
|
"struct" => Token::Struct,
|
||||||
_ => Token::Identifier(value),
|
_ => Token::Identifier(value),
|
||||||
};
|
};
|
||||||
variant
|
variant
|
||||||
@ -249,6 +254,7 @@ pub fn tokenize<T: Into<String>>(to_tokenize: T) -> Result<Vec<FullToken>, Error
|
|||||||
'{' => Token::BraceOpen,
|
'{' => Token::BraceOpen,
|
||||||
'}' => Token::BraceClose,
|
'}' => Token::BraceClose,
|
||||||
',' => Token::Comma,
|
',' => Token::Comma,
|
||||||
|
'.' => Token::Dot,
|
||||||
// Invalid token
|
// Invalid token
|
||||||
_ => Err(Error::InvalidToken(*character, cursor.position))?,
|
_ => Err(Error::InvalidToken(*character, cursor.position))?,
|
||||||
};
|
};
|
||||||
|
15
reid_src/struct.reid
Normal file
15
reid_src/struct.reid
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
// Arithmetic, function calls and imports!
|
||||||
|
|
||||||
|
struct Test {
|
||||||
|
field: i32,
|
||||||
|
second: u32
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() -> u32 {
|
||||||
|
let value = Test {
|
||||||
|
field: 5,
|
||||||
|
second: 3,
|
||||||
|
};
|
||||||
|
|
||||||
|
return Test.second;
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user