fixed minor issues
This commit is contained in:
parent
981a6688d4
commit
5b24bd80ac
|
@ -16,14 +16,16 @@ pub fn rat_to_int(args: &[Data]) -> Result<Option<Data>, ()> {
|
|||
|
||||
pub fn str_to_int(args: &[Data]) -> Result<Option<Data>, ()> {
|
||||
match &args[0] {
|
||||
Data::Str(val) => Ok(Some(Data::Int(val.parse().unwrap_or(0)))),
|
||||
Data::Str(val) => {
|
||||
Ok(Some(Data::Int(val.trim().parse().unwrap_or(0))))
|
||||
},
|
||||
_ => Err(())
|
||||
}
|
||||
}
|
||||
|
||||
pub fn str_to_rat(args: &[Data]) -> Result<Option<Data>, ()> {
|
||||
match &args[0] {
|
||||
Data::Str(val) => Ok(Some(Data::Rat(val.parse().unwrap_or(0.0)))),
|
||||
Data::Str(val) => Ok(Some(Data::Rat(val.trim().parse().unwrap_or(0.0)))),
|
||||
_ => Err(())
|
||||
}
|
||||
}
|
||||
|
|
|
@ -12,6 +12,12 @@ pub fn println(args: &[Data]) -> Result<Option<Data>, ()> {
|
|||
Ok(None)
|
||||
}
|
||||
|
||||
pub fn read_line(_: &[Data]) -> Result<Option<Data>, ()> {
|
||||
let mut buf = String::new();
|
||||
std::io::stdin().read_line(&mut buf).unwrap();
|
||||
Ok(Some(Data::Str(buf)))
|
||||
}
|
||||
|
||||
pub fn get_module_funs<'a>() -> Vec<crate::builtin::BuiltinFun> {
|
||||
vec![
|
||||
BuiltinFun {
|
||||
|
@ -22,5 +28,9 @@ pub fn get_module_funs<'a>() -> Vec<crate::builtin::BuiltinFun> {
|
|||
declr: Declr::generate_builtin("println", vec![("text", Prim::Str)], None),
|
||||
func: &println
|
||||
},
|
||||
BuiltinFun {
|
||||
declr: Declr::generate_builtin("readline", vec![], Some(Prim::Str)),
|
||||
func: &read_line
|
||||
},
|
||||
]
|
||||
}
|
15
src/main.rs
15
src/main.rs
|
@ -40,14 +40,21 @@ fn compile(settings: &Settings) -> Option<(Vec<Func>, Vec<Declr>, Vec<BuiltinFun
|
|||
|
||||
if let Ok((funcs, declrs, builtin)) = parser.parse(&mut tokens, &mut diagnostics, &settings) {
|
||||
if let Ok(prog) = vmrt::compile(&funcs, &declrs, builtin, &settings) {
|
||||
|
||||
println!("{}", diagnostics);
|
||||
|
||||
if let Ok(exit_code) = vmrt::execute(&prog) {
|
||||
crate::message(MessageType::Info, format!("Program exited with {}", exit_code));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
} else {
|
||||
println!("{}", diagnostics);
|
||||
}
|
||||
} else {
|
||||
println!("{}", diagnostics);
|
||||
}
|
||||
} else {
|
||||
println!("{}", diagnostics);
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
|
|
|
@ -147,7 +147,7 @@ pub struct Declr<'a> {
|
|||
|
||||
impl<'a> Declr<'a> {
|
||||
|
||||
pub fn generate_builtin(name: &'static str, args: Vec<(&'static str, Prim)>, ret: Option<Prim>) -> Declr {
|
||||
pub fn generate_builtin(name: &'static str, args: Vec<(&'static str, Prim)>, ret: Option<Prim>) -> Declr<'a> {
|
||||
Declr {
|
||||
name: Some(name),
|
||||
args: if args.is_empty() {
|
||||
|
|
|
@ -150,7 +150,7 @@ impl Operator {
|
|||
}
|
||||
|
||||
for (x, typ) in types.iter().enumerate() {
|
||||
if *typ != operands[x] {
|
||||
if *typ != operands[operands.len() - x - 1] {
|
||||
return Err(());
|
||||
}
|
||||
}
|
||||
|
@ -596,8 +596,8 @@ const TOKEN_REGEX_SRC: &'static str = concat!(
|
|||
r"|'([a-zA-Z0-9_]+)", // labels: 'example
|
||||
r"|(goto\s+[a-zA-Z0-9_]+", // goto example
|
||||
r"|despite|until|loop|break|cont|ret|yield|please)", // keywords
|
||||
r"|[\W\s]{0,1}(int|rat|bool|str)[\W\s]{0,1}", // raw data types
|
||||
r"|(true|false|ye|no|maybe)", // boolean values
|
||||
r"|\b(int|rat|bool|str)\b", // raw data types
|
||||
r"|\b(true|false|ye|no|maybe)\b", // boolean values
|
||||
r"|([A-Za-z_]+)\s*(?::\s*([a-zA-Z0-9_]+))?\s*=[^=]", // assignment var:int=
|
||||
r"|([A-Za-z_]+)\s*(?::\s*([a-zA-Z0-9_]+))", // declaration var:int
|
||||
r"|([A-Za-z_]+)", // symbol
|
||||
|
|
|
@ -323,32 +323,44 @@ fn parse_term<'a>(
|
|||
Prim::Int => Instr::Operation(Operation::Int(IntOp::CmpEq)),
|
||||
Prim::Rat => Instr::Operation(Operation::Rat(RatOp::CmpEq)),
|
||||
Prim::Bool => Instr::Operation(Operation::Bool(BoolOp::CmpEq)),
|
||||
Prim::Num(NumHint::Int) => Instr::Operation(Operation::Int(IntOp::CmpEq)),
|
||||
Prim::Num(NumHint::Rat) => Instr::Operation(Operation::Rat(RatOp::CmpEq)),
|
||||
_ => panic!(),
|
||||
},
|
||||
crate::token::Operator::NotEq => match hint.unwrap() {
|
||||
Prim::Int => Instr::Operation(Operation::Int(IntOp::CmpNEq)),
|
||||
Prim::Rat => Instr::Operation(Operation::Rat(RatOp::CmpNEq)),
|
||||
Prim::Bool => Instr::Operation(Operation::Bool(BoolOp::CmpNEq)),
|
||||
Prim::Num(NumHint::Int) => Instr::Operation(Operation::Int(IntOp::CmpNEq)),
|
||||
Prim::Num(NumHint::Rat) => Instr::Operation(Operation::Rat(RatOp::CmpNEq)),
|
||||
_ => panic!(),
|
||||
},
|
||||
crate::token::Operator::Lt => match hint.unwrap() {
|
||||
Prim::Int => Instr::Operation(Operation::Int(IntOp::CmpLt)),
|
||||
Prim::Rat => Instr::Operation(Operation::Rat(RatOp::CmpLt)),
|
||||
Prim::Num(NumHint::Int) => Instr::Operation(Operation::Int(IntOp::CmpLt)),
|
||||
Prim::Num(NumHint::Rat) => Instr::Operation(Operation::Rat(RatOp::CmpLt)),
|
||||
_ => panic!(),
|
||||
},
|
||||
crate::token::Operator::Gt => match hint.unwrap() {
|
||||
Prim::Int => Instr::Operation(Operation::Int(IntOp::CmpGt)),
|
||||
Prim::Rat => Instr::Operation(Operation::Rat(RatOp::CmpGt)),
|
||||
Prim::Num(NumHint::Int) => Instr::Operation(Operation::Int(IntOp::CmpGt)),
|
||||
Prim::Num(NumHint::Rat) => Instr::Operation(Operation::Rat(RatOp::CmpGt)),
|
||||
_ => panic!(),
|
||||
},
|
||||
crate::token::Operator::GtEq => match hint.unwrap() {
|
||||
Prim::Int => Instr::Operation(Operation::Int(IntOp::CmpGtEq)),
|
||||
Prim::Rat => Instr::Operation(Operation::Rat(RatOp::CmpGtEq)),
|
||||
Prim::Num(NumHint::Int) => Instr::Operation(Operation::Int(IntOp::CmpGtEq)),
|
||||
Prim::Num(NumHint::Rat) => Instr::Operation(Operation::Rat(RatOp::CmpGtEq)),
|
||||
_ => panic!(),
|
||||
},
|
||||
crate::token::Operator::LtEq => match hint.unwrap() {
|
||||
Prim::Int => Instr::Operation(Operation::Int(IntOp::CmpLtEq)),
|
||||
Prim::Rat => Instr::Operation(Operation::Rat(RatOp::CmpLtEq)),
|
||||
Prim::Num(NumHint::Int) => Instr::Operation(Operation::Int(IntOp::CmpLtEq)),
|
||||
Prim::Num(NumHint::Rat) => Instr::Operation(Operation::Rat(RatOp::CmpLtEq)),
|
||||
_ => panic!(),
|
||||
},
|
||||
|
||||
|
@ -742,7 +754,7 @@ pub fn execute(prog: &Program) -> Result<i64, ()> {
|
|||
return Ok(exit_code.to_int()?);
|
||||
}
|
||||
|
||||
crate::message(crate::token::MessageType::Critical, "main procedure did not return exit code");
|
||||
crate::message(crate::token::MessageType::Critical, "main function did not return exit code");
|
||||
return Err(());
|
||||
} else {
|
||||
crate::message(
|
||||
|
|
56
test.erpn
56
test.erpn
|
@ -4,6 +4,8 @@ extern function print
|
|||
|
||||
extern function println
|
||||
|
||||
extern function readline
|
||||
|
||||
extern function to_rat
|
||||
|
||||
extern function to_int
|
||||
|
@ -12,10 +14,22 @@ extern function parse_int
|
|||
|
||||
extern function parse_rat
|
||||
|
||||
extern function cos
|
||||
|
||||
extern function pow
|
||||
|
||||
extern function sin
|
||||
|
||||
extern function tan
|
||||
|
||||
extern function ln
|
||||
|
||||
extern function sqrt
|
||||
|
||||
fac:
|
||||
Load Arg x
|
||||
Load Int 1
|
||||
NotEq Int
|
||||
Load Int 2
|
||||
Gt Num(Int)
|
||||
Unless
|
||||
Load Int 1
|
||||
Yield
|
||||
|
@ -24,40 +38,18 @@ fac:
|
|||
Sub Int
|
||||
Call fac
|
||||
Load Arg x
|
||||
Mul Int
|
||||
Yield
|
||||
|
||||
number:
|
||||
Load Rat 12.0
|
||||
Load Int 2
|
||||
Sub Int
|
||||
Call fac
|
||||
Add Int
|
||||
|
||||
main:
|
||||
Call number
|
||||
Call to_int
|
||||
Load Int 24
|
||||
Call fac
|
||||
Store Int result
|
||||
Load String "The Factorial of "
|
||||
Call number
|
||||
Load String " is: "
|
||||
Load Var result
|
||||
Cat Str
|
||||
Cat Str
|
||||
Store Int c
|
||||
Load String "factorial: "
|
||||
Load Var c
|
||||
Cat Str
|
||||
Call println
|
||||
Load Int 0
|
||||
Store Int x
|
||||
Loopstart
|
||||
Load Var x
|
||||
Load Int 9
|
||||
Gt Int
|
||||
While
|
||||
Load String ""
|
||||
Load Var x
|
||||
Cat Str
|
||||
Call println
|
||||
Load Var x
|
||||
Load Int 1
|
||||
Add Int
|
||||
Store Int x
|
||||
Load Int 0
|
||||
Yield
|
||||
|
||||
|
|
31
test.yard
31
test.yard
|
@ -1,31 +1,18 @@
|
|||
@feature(io, conv)
|
||||
@feature(io, conv, math)
|
||||
@version(100)
|
||||
@author(Sven Vogel)
|
||||
|
||||
-- compute the factorial
|
||||
-- in a recursive and functional way
|
||||
fac(x:int) = int {
|
||||
despite x != 1 {
|
||||
yield 1;
|
||||
max(a:int, b:int)=int {
|
||||
despite a < b {
|
||||
yield a
|
||||
}
|
||||
b
|
||||
}
|
||||
|
||||
yield fac(x - 1) * x
|
||||
}
|
||||
|
||||
number = rat 12.0 # this is a function without arguments and a braceless body
|
||||
|
||||
// main function
|
||||
# main function
|
||||
main = int {
|
||||
|
||||
result = fac(to_int(number));
|
||||
println("" .. max(3,4));
|
||||
|
||||
println("The Factorial of " .. number() .. " is: " .. result);
|
||||
|
||||
x:int = 0;
|
||||
until x > 9 {
|
||||
println("" .. x);
|
||||
x = x + 1
|
||||
}
|
||||
|
||||
yield 0;
|
||||
0
|
||||
}
|
Loading…
Reference in New Issue