aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/compiler.rs45
-rw-r--r--src/lib.rs4
2 files changed, 45 insertions, 4 deletions
diff --git a/src/compiler.rs b/src/compiler.rs
index 76294d3..56a1d44 100644
--- a/src/compiler.rs
+++ b/src/compiler.rs
@@ -1529,6 +1529,44 @@ impl<'a> Compiler<'a> {
}
}
+ fn outer_statement(&mut self, block: &mut Block) {
+ self.clear_panic();
+ match self.peek_four() {
+ (Token::Identifier(name), Token::ColonEqual, ..) => {
+ self.eat();
+ self.eat();
+ self.definition_statement(&name, Type::Unknown, block);
+ },
+
+ (Token::Identifier(name), Token::ColonColon, ..) => {
+ self.eat();
+ self.eat();
+ self.constant_statement(&name, Type::Unknown, block);
+ },
+
+ (Token::Blob, Token::Identifier(_), ..) => {
+ self.blob_statement(block);
+ },
+
+ (Token::Identifier(name), Token::Colon, ..) => {
+ self.eat();
+ self.eat();
+ if let Ok(typ) = self.parse_type() {
+ expect!(self, Token::Equal, "Expected assignment.");
+ self.definition_statement(&name, typ, block);
+ } else {
+ error!(self, format!("Expected type found '{:?}'.", self.peek()));
+ }
+ }
+
+ (Token::Newline, ..) => {}
+
+ _ => {
+ error!(self, "Invalid outer statement.");
+ }
+ }
+ }
+
fn statement(&mut self, block: &mut Block) {
self.clear_panic();
@@ -1700,7 +1738,7 @@ impl<'a> Compiler<'a> {
for section in 0..self.sections.len() {
self.init_section(section);
while self.peek() != Token::EOF {
- self.statement(&mut block);
+ self.outer_statement(&mut block);
expect!(self, Token::Newline | Token::EOF,
"Expect newline or EOF after expression.");
}
@@ -1710,7 +1748,6 @@ impl<'a> Compiler<'a> {
add_op(self, &mut block, Op::Return);
block.ty = Type::Function(Vec::new(), Box::new(Type::Void));
- println!("{:?}", self.names);
if self.names.len() != 0 {
let errors: Vec<_> = self.names.iter().filter_map(|(name, kind)|
if let Name::Unknown(_, line) = kind {
@@ -1725,6 +1762,10 @@ impl<'a> Compiler<'a> {
}
}
+ let constant = self.find_constant("start");
+ add_op(self, &mut block, Op::Constant(constant));
+ add_op(self, &mut block, Op::Call(0));
+
for var in self.current_context_mut().pop().unwrap().stack.iter().skip(1) {
if !(var.read || var.upvalue) {
let e = ErrorKind::SyntaxError(var.line, Token::Identifier(var.name.clone()));
diff --git a/src/lib.rs b/src/lib.rs
index 019d2d3..19ee8d7 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -881,7 +881,7 @@ mod tests {
#[test]
fn $fn() {
crate::tests::panic_after(std::time::Duration::from_millis(500), || {
- let prog = std::concat!("q :: fn {", $prog, "\n{}\n}\nq()");
+ let prog = std::concat!("start :: fn {", $prog, "\n{}\n}\n");
match $crate::run_string(&prog, true, Vec::new()) {
Ok(()) => {},
Err(errs) => {
@@ -899,7 +899,7 @@ mod tests {
#[test]
fn $fn() {
crate::tests::panic_after(std::time::Duration::from_millis(500), || {
- let prog = std::concat!("q :: fn {", $prog, "\n{}\n}\nq()");
+ let prog = std::concat!("start :: fn {", $prog, "\n{}\n}\n");
$crate::assert_errs!($crate::run_string(&prog, true, Vec::new()), $errs);
})
}