Compare commits
	
		
			2 Commits
		
	
	
		
			309149c7dd
			...
			6e37e3a5dd
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|   | 6e37e3a5dd | ||
|   | cfe24aa107 | 
| @ -16,8 +16,8 @@ pub enum Either<L, R> | |||||||
|     Right(R) |     Right(R) | ||||||
| end | end | ||||||
| 
 | 
 | ||||||
| pub inst Functor[*T] for Option<T> | pub impl Functor[*T] for Option<T> | ||||||
|     impl fn <U> map(ftu: fn (t: T) -> U) -> Self<U> |     fn <U> map(ftu: fn (t: &*T) -> U) -> Self<U> | ||||||
|         if self is Some(t) then |         if self is Some(t) then | ||||||
|             Some(ftu(t)) |             Some(ftu(t)) | ||||||
|         else |         else | ||||||
| @ -26,20 +26,20 @@ pub inst Functor[*T] for Option<T> | |||||||
|     end |     end | ||||||
| end | end | ||||||
| 
 | 
 | ||||||
| pub inst Functor[*T] for Either<_, *T> | pub impl Functor[*R] for Either<_, *R> | ||||||
|     impl fn <U> map(ftu: fn (t: *T) -> U) -> Self<U> |     fn <U> map(f: fn (t: &*R) -> U) -> Self<_, U> | ||||||
|         if self is Right(t) then |         if self is Right(t) then | ||||||
|             Right(ftu(t)) |             Right(f(t)) | ||||||
|         else |         else | ||||||
|             self |             self | ||||||
|         end |         end | ||||||
|     end |     end | ||||||
| end | end | ||||||
| 
 | 
 | ||||||
| pub inst Functor[*L -> *R] for Either<L, R> | pub impl Functor[*L -> *R] for Either<L, R> | ||||||
|     impl fn mapLeft(flr: fn (l: *L) -> *R) -> Self<*L, *R> |     fn mapLeft(f: fn (l: &*L) -> *R) -> Self<*L, *R> | ||||||
|         if self is Left(l) then |         if self is Left(l) then | ||||||
|             Right(flr(l)) |             Right(f(l)) | ||||||
|         else |         else | ||||||
|             self |             self | ||||||
|         end |         end | ||||||
| @ -48,100 +48,53 @@ end | |||||||
| 
 | 
 | ||||||
| pub trait Monad[*T] | pub trait Monad[*T] | ||||||
|     static fn lift(t: *T) -> Self<*T> |     static fn lift(t: *T) -> Self<*T> | ||||||
|     fn <U> flatMap(f: fn (t: *T) -> Self<U>) -> Self<U> |     fn <U> flatMap(f: fn (t: &*T) -> Self<U>) -> Self<U> | ||||||
| end | end | ||||||
| 
 | 
 | ||||||
| pub trait Default | pub trait Default | ||||||
|     static fn default() -> Self |     static fn default() -> Self | ||||||
| end | end | ||||||
| 
 | 
 | ||||||
| pub trait Empty[*T] where *T has Default | pub trait Empty[*T] | ||||||
|     static fn empty() -> Self<*T> |     static fn empty() -> Self<*T> | ||||||
| end | end | ||||||
| 
 | 
 | ||||||
| pub trait Semigroup[*T] | pub trait Semigroup[*T] | ||||||
|     fn concat(other: &Self<*T>) -> Self<&*T> |     type Other<*T> | ||||||
|     cons fn consConcat(other: Self<*T>) -> Self<*T> | 
 | ||||||
|  |     fn concat(other: &Other<*T>) -> Self<&*T> | ||||||
|  |     cons fn consConcat(other: Other<*T>) -> Self<*T> | ||||||
| end | end | ||||||
| 
 | 
 | ||||||
| pub int Iterable<T> | pub int Iterable<T> | ||||||
|     fn iter() -> Iterator<T> |     fn iter() -> Iterator<T> ref self | ||||||
|     cons fn consIter() -> ConsIterator<T> |     cons fn consIter() -> ConsIterator<T> | ||||||
| end | end | ||||||
| 
 | 
 | ||||||
| pub int Iterator<T> | pub int Iterator<T> | ||||||
|     fn next() -> Option<&T> |     fn next() -> Option<&T ref self> | ||||||
|     fn withIndex() -> Iterator<Option<(Int, &T)>> |  | ||||||
| end | end | ||||||
| 
 | 
 | ||||||
| pub int ConsIterator<T> | pub int ConsIterator<T> | ||||||
|     fn next() -> Option<T> |     fn next() -> Option<T> | ||||||
|     fn withIndex() -> Iterator<Option<(Int, T)>> |  | ||||||
| end | end | ||||||
| 
 | 
 | ||||||
| pub int List<T> : Iterable<T> req Monad, Functor, Semigroup, Empty | pub impl Semigroup[*T] for Iterable<*T> | ||||||
|     fn add(t: T) -> Void |     type Other = Iterable<*T> | ||||||
| end |  | ||||||
| 
 | 
 | ||||||
| pub inst Functor[*T] for List<*T> where *T has Default |     fn concat(other: &Other<*T>) -> Self<*T> | ||||||
|     impl fn <U> map(ftu: (t: *T) -> U) -> Self<U> |         let result: Self<*T> = ArrayList(count()) | ||||||
|         let mut result: Self<U> = Self::empty() |  | ||||||
|         for t in self do |         for t in self do | ||||||
|             result += Self::lift(ftu(t)) |             result.add(t) | ||||||
|  |         end | ||||||
|  |         for t in other do | ||||||
|  |             result.add(t) | ||||||
|         end |         end | ||||||
|         result |         result | ||||||
|     end |     end | ||||||
| end |  | ||||||
| 
 | 
 | ||||||
| pub class ArrayList<T> : List<T> |     cons fn consConcat(other: Other<*T>) -> Self<*T> | ||||||
| 
 |         let result: Self<*T> = ArrayList(count()) | ||||||
|     let init: fn () -> T // ?: sugar for Option<fn () -> T> |  | ||||||
|     let capacity: USize |  | ||||||
|     let mut ts: Array<T> |  | ||||||
|     let count: USize = 0 |  | ||||||
| 
 |  | ||||||
|     pub ctor(startCapacity: USize = 10, init: fn () -> T = Default::default) where T has Default |  | ||||||
|         := init |  | ||||||
|         capacity = startCapacity  // ?= sugar for Some(expr) |  | ||||||
|         ts = array(startCapacity, init) |  | ||||||
|     end |  | ||||||
| 
 |  | ||||||
|     pub ctor(init: fn () -> T, startCapacity: USize = 10) |  | ||||||
|         := init |  | ||||||
|         capacity = startCapacity |  | ||||||
|         ts = array(startCapacity, init) |  | ||||||
|     end |  | ||||||
| 
 |  | ||||||
|     impl fn iter() -> Iterator<T> |  | ||||||
|         todo() |  | ||||||
|     end |  | ||||||
| 
 |  | ||||||
|     impl fn add(t: T) -> Void |  | ||||||
|         ts[count] = t |  | ||||||
|         count++ |  | ||||||
|         if count == capacity then |  | ||||||
|             resize() |  | ||||||
|         end |  | ||||||
|     end |  | ||||||
| 
 |  | ||||||
|     fn resize() -> Void |  | ||||||
|         let oldTs = mem::take(&ts, array(capacity * 2, init)) |  | ||||||
|         for (i, t) in oldTs.consIter().withIndex() do |  | ||||||
|             ts[i] = t |  | ||||||
|         end |  | ||||||
|     end |  | ||||||
| 
 |  | ||||||
| end |  | ||||||
| 
 |  | ||||||
| pub inst Empty[*T] for ArrayList<*T> |  | ||||||
|     where *T has Default |  | ||||||
|     impl static fn empty() -> List<*T> = Self() |  | ||||||
| end |  | ||||||
| 
 |  | ||||||
| pub inst Semigroup[*T] for ArrayList<*T> |  | ||||||
|     where *T has Default |  | ||||||
|     impl fn concat(other: List<*T>) -> List<*T> |  | ||||||
|         let result = Self() |  | ||||||
|         for t in self do |         for t in self do | ||||||
|             result.add(t) |             result.add(t) | ||||||
|         end |         end | ||||||
| @ -152,18 +105,35 @@ pub inst Semigroup[*T] for ArrayList<*T> | |||||||
|     end |     end | ||||||
| end | end | ||||||
| 
 | 
 | ||||||
| pub inst Monad[*T] for ArrayList<*T> | pub int List<T> : Iterable<T> | ||||||
|     where T has Default |     fn add(t: T) -> Void | ||||||
|     impl static fn lift(t: *T) -> List<*T> | end | ||||||
|         let result: List<*T> = Self() | 
 | ||||||
|  | pub impl Functor[*T] for List<*T> | ||||||
|  |     fn <U> map(f: (t: &*T) -> U) -> Self<U> | ||||||
|  |         let mut result: Self<U> = ArrayList(count()) | ||||||
|  |         for t in self do | ||||||
|  |             result.add(f(t)) | ||||||
|  |         end | ||||||
|  |         result | ||||||
|  |     end | ||||||
|  | end | ||||||
|  | 
 | ||||||
|  | pub impl Empty[*T] for List<*T> | ||||||
|  |     static fn empty() -> List<*T> = ArrayList() | ||||||
|  | end | ||||||
|  | 
 | ||||||
|  | pub inst Monad[*T] for List<*T> | ||||||
|  |     static fn lift(t: *T) -> List<*T> | ||||||
|  |         let result: List<*T> = ArrayList() | ||||||
|         result.add(t) |         result.add(t) | ||||||
|         result |         result | ||||||
|     end |     end | ||||||
| 
 | 
 | ||||||
|     impl fn <U> flatMap(f: fn (t: *T) -> List<U>) -> List<U> |     fn <U> flatMap(f: fn (t: &*T) -> List<U>) -> List<U> | ||||||
|         let result: List<U> = Self() |         let result: List<U> = ArrayList(count()) | ||||||
|         for t in self do |         for t in self do | ||||||
|             for u in f(t) do |             for u in f(t).consIter() do | ||||||
|                 result.add(u) |                 result.add(u) | ||||||
|             end |             end | ||||||
|         end |         end | ||||||
| @ -171,6 +141,69 @@ pub inst Monad[*T] for ArrayList<*T> | |||||||
|     end |     end | ||||||
| end | end | ||||||
| 
 | 
 | ||||||
|  | pub class ArrayList<T> : List<T> | ||||||
|  | 
 | ||||||
|  |     let capacity: USize | ||||||
|  |     let mut ts: Array<Option<T>> | ||||||
|  |     let count: USize = 0 | ||||||
|  | 
 | ||||||
|  |     pub ctor(startCapacity: USize = 10) | ||||||
|  |         capacity = startCapacity | ||||||
|  |         ts = array(startCapacity, None) | ||||||
|  |     end | ||||||
|  | 
 | ||||||
|  |     class ArrayListIterator<T>(owner: &ArrayList<T>) /* ref owner (implied by constructor) */ : Iterator<T> | ||||||
|  |         let i: USize = 0 | ||||||
|  | 
 | ||||||
|  |         impl fn next() -> Option<&T ref self> | ||||||
|  |             if owner.ts[i] is Some(t) then | ||||||
|  |                 i++ | ||||||
|  |                 Some(t) | ||||||
|  |             else | ||||||
|  |                 None | ||||||
|  |             end | ||||||
|  |         end | ||||||
|  |     end | ||||||
|  | 
 | ||||||
|  |     class ConsArrayListIterator<T>(ts: Array<Option<T>>) : ConsIterator<T> | ||||||
|  |         let i: USize = 0 | ||||||
|  | 
 | ||||||
|  |         impl fn next() -> Option<T> | ||||||
|  |             if ts[i] is Some then | ||||||
|  |                 let wrappedT = mem::take(ts[i], None) | ||||||
|  |                 i++ | ||||||
|  |                 wrappedT | ||||||
|  |             else | ||||||
|  |                 None | ||||||
|  |             end | ||||||
|  |         end | ||||||
|  |     end | ||||||
|  | 
 | ||||||
|  |     impl fn iter() -> Iterator<&T> ref self | ||||||
|  |         ArrayListIterator(&self) | ||||||
|  |     end | ||||||
|  | 
 | ||||||
|  |     impl cons fn consIter() -> Iterator<T> | ||||||
|  |         ConsArrayListIterator(mem::take(ts, arrays::empty())) | ||||||
|  |     end | ||||||
|  | 
 | ||||||
|  |     impl fn add(t: T) -> Void | ||||||
|  |         ts[count] = Some(t) | ||||||
|  |         count++ | ||||||
|  |         if count == capacity then | ||||||
|  |             resize() | ||||||
|  |         end | ||||||
|  |     end | ||||||
|  | 
 | ||||||
|  |     fn resize() -> Void | ||||||
|  |         let oldTs = mem::take(&ts, array(capacity * 2, None)) | ||||||
|  |         for (i, wrappedT) in oldTs.consIter() do | ||||||
|  |             ts[i] = wrappedT | ||||||
|  |         end | ||||||
|  |     end | ||||||
|  | 
 | ||||||
|  | end | ||||||
|  | 
 | ||||||
| pub mod std::core | pub mod std::core | ||||||
| 
 | 
 | ||||||
|     pub mod mem |     pub mod mem | ||||||
| @ -181,8 +214,8 @@ pub mod std::core | |||||||
| 
 | 
 | ||||||
|     pub native fn <T> array(capacity: USize) -> Array<T> where T has Default |     pub native fn <T> array(capacity: USize) -> Array<T> where T has Default | ||||||
| 
 | 
 | ||||||
|     pub fn <T> list(...items: Array<T>) -> List<T> where T has Default |     pub fn <T> list(...items: Array<T>) -> List<T> | ||||||
|         let result = ArrayList(items.capacity(), Default[T]::default) |         let result = ArrayList(items.capacity()) | ||||||
|         for item in items.consIter() do |         for item in items.consIter() do | ||||||
|             result.add(item) |             result.add(item) | ||||||
|         end |         end | ||||||
| @ -191,8 +224,7 @@ pub mod std::core | |||||||
| 
 | 
 | ||||||
| end | end | ||||||
| 
 | 
 | ||||||
| // other file | // Other file | ||||||
| use std::collections::List |  | ||||||
| use std::hkt::{Functor[List], Monad[List]} | use std::hkt::{Functor[List], Monad[List]} | ||||||
| 
 | 
 | ||||||
| fn main() | fn main() | ||||||
|  | |||||||
| @ -1,10 +1,10 @@ | |||||||
| // mod name_analysis;
 | mod name_analysis; | ||||||
| mod p3; | mod p3; | ||||||
| // mod unparse;
 | // mod unparse;
 | ||||||
| 
 | 
 | ||||||
| use std::path::PathBuf; | use std::path::PathBuf; | ||||||
| 
 | 
 | ||||||
| // use crate::name_analysis::name_analysis;
 | use crate::name_analysis::name_analysis; | ||||||
| use crate::p3::pretty_print_parse; | use crate::p3::pretty_print_parse; | ||||||
| // use crate::unparse::unparse;
 | // use crate::unparse::unparse;
 | ||||||
| use clap::{Parser, Subcommand}; | use clap::{Parser, Subcommand}; | ||||||
| @ -44,12 +44,12 @@ fn main() { | |||||||
|                 pretty_print_parse(&path) |                 pretty_print_parse(&path) | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|         // Commands::NameAnalysis { paths } => {
 |         Commands::NameAnalysis { paths } => { | ||||||
|         //     let result = name_analysis(&paths);
 |             let result = name_analysis(&paths); | ||||||
|         //     if let Err(e) = result {
 |             if let Err(e) = result { | ||||||
|         //         eprintln!("{}", e)
 |                 eprintln!("{}", e) | ||||||
|         //     }
 |             } | ||||||
|         // }
 |         } | ||||||
|         _ => todo!(), |         _ => todo!(), | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  | |||||||
| @ -20,8 +20,7 @@ pub fn name_analysis(paths: &Vec<PathBuf>) -> Result<(), Box<dyn std::error::Err | |||||||
| 
 | 
 | ||||||
|         match parse_result { |         match parse_result { | ||||||
|             Ok(mut pairs) => { |             Ok(mut pairs) => { | ||||||
|                 let compilation_unit_pair = pairs.next().unwrap(); |                 let compilation_unit = build_ast(file_id, &mut pairs); | ||||||
|                 let compilation_unit = build_ast(&path.display().to_string(), file_id, compilation_unit_pair); |  | ||||||
|                 compilation_units.push(compilation_unit); |                 compilation_units.push(compilation_unit); | ||||||
|                 Ok::<(), Box<dyn std::error::Error>>(()) |                 Ok::<(), Box<dyn std::error::Error>>(()) | ||||||
|             } |             } | ||||||
| @ -32,7 +31,10 @@ pub fn name_analysis(paths: &Vec<PathBuf>) -> Result<(), Box<dyn std::error::Err | |||||||
|     let mut symbol_table = SymbolTable::new(); |     let mut symbol_table = SymbolTable::new(); | ||||||
|     add_std_core_symbols(&mut symbol_table).expect("Failed to add std::core symbols."); |     add_std_core_symbols(&mut symbol_table).expect("Failed to add std::core symbols."); | ||||||
|     
 |     
 | ||||||
|     let diagnostics = analyze_names(&mut compilation_units, &mut symbol_table); |     let diagnostics = analyze_names( | ||||||
|  |         &mut compilation_units.iter().map(Box::as_mut), | ||||||
|  |         &mut symbol_table | ||||||
|  |     ); | ||||||
|     if diagnostics.is_empty() { |     if diagnostics.is_empty() { | ||||||
|         println!("Name analysis complete."); |         println!("Name analysis complete."); | ||||||
|         println!("Symbol table\n-------\n{}", symbol_table); |         println!("Symbol table\n-------\n{}", symbol_table); | ||||||
| @ -5,7 +5,7 @@ extern crate core; | |||||||
| pub mod ast; | pub mod ast; | ||||||
| pub mod diagnostic; | pub mod diagnostic; | ||||||
| pub mod module; | pub mod module; | ||||||
| // pub mod name_analysis;
 | pub mod name_analysis; | ||||||
| pub mod object_file; | pub mod object_file; | ||||||
| pub mod parser; | pub mod parser; | ||||||
| pub mod std_core; | pub mod std_core; | ||||||
|  | |||||||
							
								
								
									
										1320
									
								
								src/name_analysis/gather.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1320
									
								
								src/name_analysis/gather.rs
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @ -32,7 +32,7 @@ pub mod symbol; | |||||||
| pub mod symbol_table; | pub mod symbol_table; | ||||||
| 
 | 
 | ||||||
| pub fn analyze_names( | pub fn analyze_names( | ||||||
|     compilation_units: &mut Vec<CompilationUnit>, |     compilation_units: &mut [CompilationUnit], | ||||||
|     symbol_table: &mut SymbolTable, |     symbol_table: &mut SymbolTable, | ||||||
| ) -> Vec<DmDiagnostic> { | ) -> Vec<DmDiagnostic> { | ||||||
|     let mut diagnostics = vec![]; |     let mut diagnostics = vec![]; | ||||||
| @ -1,11 +1,9 @@ | |||||||
| use crate::ast::node::named::Named; |  | ||||||
| use crate::ast::node::*; | use crate::ast::node::*; | ||||||
| use crate::diagnostic::DmDiagnostic; | use crate::diagnostic::DmDiagnostic; | ||||||
| use crate::name_analysis::symbol::Symbol; | use crate::name_analysis::symbol::Symbol; | ||||||
| use crate::name_analysis::symbol_table::{SymbolLookupError, SymbolTable}; | use crate::name_analysis::symbol_table::{SymbolLookupError, SymbolTable}; | ||||||
| use codespan_reporting::diagnostic::{Diagnostic, Label}; | use codespan_reporting::diagnostic::{Diagnostic, Label}; | ||||||
| use std::range::Range; | use std::range::Range; | ||||||
| /* Type Use */ |  | ||||||
| 
 | 
 | ||||||
| fn resolve_type_use( | fn resolve_type_use( | ||||||
|     type_use: &mut TypeUse, |     type_use: &mut TypeUse, | ||||||
| @ -1,3 +1,4 @@ | |||||||
|  | use crate::ast::node::Identifier; | ||||||
| use std::cell::RefCell; | use std::cell::RefCell; | ||||||
| use std::fmt::{Debug, Display, Formatter}; | use std::fmt::{Debug, Display, Formatter}; | ||||||
| use std::ops::Deref; | use std::ops::Deref; | ||||||
| @ -1,14 +1,14 @@ | |||||||
| // use crate::name_analysis::symbol::{FunctionSymbol, ParameterSymbol};
 | use crate::name_analysis::symbol::{FunctionSymbol, ParameterSymbol}; | ||||||
| // use crate::name_analysis::symbol_table::{SymbolInsertError, SymbolTable};
 | use crate::name_analysis::symbol_table::{SymbolInsertError, SymbolTable}; | ||||||
| //
 | 
 | ||||||
| // pub fn add_std_core_symbols(symbol_table: &mut SymbolTable) -> Result<(), SymbolInsertError> {
 | pub fn add_std_core_symbols(symbol_table: &mut SymbolTable) -> Result<(), SymbolInsertError> { | ||||||
| //     symbol_table.insert_function_symbol(
 |     symbol_table.insert_function_symbol( | ||||||
| //         FunctionSymbol::new("std::core::println", "println", true, true, None)
 |         FunctionSymbol::new("std::core::println", "println", true, true, None) | ||||||
| //             .with_parameters(vec![ParameterSymbol::new("msg", None)]),
 |             .with_parameters(vec![ParameterSymbol::new("msg", None)]), | ||||||
| //     )?;
 |     )?; | ||||||
| //     symbol_table.insert_function_symbol(
 |     symbol_table.insert_function_symbol( | ||||||
| //         FunctionSymbol::new("std::core::print", "print", true, true, None)
 |         FunctionSymbol::new("std::core::print", "print", true, true, None) | ||||||
| //             .with_parameters(vec![ParameterSymbol::new("msg", None)]),
 |             .with_parameters(vec![ParameterSymbol::new("msg", None)]), | ||||||
| //     )?;
 |     )?; | ||||||
| //     Ok(())
 |     Ok(()) | ||||||
| // }
 | } | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user