Gonna checkpoint here - got basic fungll working, did a mod to allow strings as terminals, working on getting recursion working.
This commit is contained in:
@@ -38,8 +38,9 @@
|
|||||||
altStart (lambda (t s k c) id)
|
altStart (lambda (t s k c) id)
|
||||||
altOp (lambda (p q) (lambda (t s k c) (lcompose (p t s k c) (q t s [] k c))))
|
altOp (lambda (p q) (lambda (t s k c) (lcompose (p t s k c) (q t s [] k c))))
|
||||||
term_parser (lambda (t [X b i] l k c) (lambda (sigma)
|
term_parser (lambda (t [X b i] l k c) (lambda (sigma)
|
||||||
(if (= (idx b (- i 1)) (idx t k)) ((c [[X b i] l (+ 1 k)]) sigma)
|
(let (this_term (idx b (- i 1)))
|
||||||
sigma)))
|
(if (= this_term (slice t k (+ k (len this_term)))) ((c [[X b i] l (+ (len this_term) k)]) sigma)
|
||||||
|
sigma))))
|
||||||
term (lambda (s) [ s term_parser ])
|
term (lambda (s) [ s term_parser ])
|
||||||
|
|
||||||
continue (lambda (BSR_element c) (lambda ([U G P Y])
|
continue (lambda (BSR_element c) (lambda ([U G P Y])
|
||||||
|
|||||||
@@ -1,6 +1,48 @@
|
|||||||
(with_import "./fungll.kp"
|
(with_import "./fungll.kp"
|
||||||
(let (
|
(let (
|
||||||
just_a_parser (parse (nterm 'A (altOp altStart (seqOp seqStart (term (idx "a" 0))))))
|
|
||||||
parse_result (just_a_parser "a")
|
_ (println "The a parser")
|
||||||
_ (println "parse result " parse_result)
|
just_a_parser (parse (nterm 'A (altOp altStart (seqOp seqStart (term "a")))))
|
||||||
|
_ (println "parse result for a " (just_a_parser "a"))
|
||||||
|
_ (println "parse result for b " (just_a_parser "b"))
|
||||||
|
_ (println "parse result for aa " (just_a_parser "aa"))
|
||||||
|
_ (println "parse result for ba " (just_a_parser "ba"))
|
||||||
|
_ (println "parse result for ab " (just_a_parser "ab"))
|
||||||
|
|
||||||
|
_ (println "The aa parser")
|
||||||
|
just_aa_parser (parse (nterm 'A (altOp altStart (seqOp seqStart (term "aa")))))
|
||||||
|
_ (println "parse result for a " (just_aa_parser "a"))
|
||||||
|
_ (println "parse result for b " (just_aa_parser "b"))
|
||||||
|
_ (println "parse result for aa " (just_aa_parser "aa"))
|
||||||
|
_ (println "parse result for ba " (just_aa_parser "ba"))
|
||||||
|
_ (println "parse result for ab " (just_aa_parser "ab"))
|
||||||
|
|
||||||
|
_ (println "The a.a parser")
|
||||||
|
just_aa_parser (parse (nterm 'A (altOp altStart (seqOp (seqOp seqStart (term "a")) (term "a")))))
|
||||||
|
_ (println "parse result for a " (just_aa_parser "a"))
|
||||||
|
_ (println "parse result for b " (just_aa_parser "b"))
|
||||||
|
_ (println "parse result for aa " (just_aa_parser "aa"))
|
||||||
|
_ (println "parse result for ba " (just_aa_parser "ba"))
|
||||||
|
_ (println "parse result for ab " (just_aa_parser "ab"))
|
||||||
|
|
||||||
|
_ (println "The b|a.a parser")
|
||||||
|
just_aa_parser (parse (nterm 'A (altOp (altOp altStart (seqOp seqStart (term "b"))) (seqOp (seqOp seqStart (term "a")) (term "a")))))
|
||||||
|
_ (println "parse result for a " (just_aa_parser "a"))
|
||||||
|
_ (println "parse result for b " (just_aa_parser "b"))
|
||||||
|
_ (println "parse result for aa " (just_aa_parser "aa"))
|
||||||
|
_ (println "parse result for ba " (just_aa_parser "ba"))
|
||||||
|
_ (println "parse result for ab " (just_aa_parser "ab"))
|
||||||
|
|
||||||
|
_ (println "The a|a,A parser")
|
||||||
|
just_aa_parser (let-rec (
|
||||||
|
As (nterm 'A (altOp (altOp altStart (seqOp seqStart (term "a"))) (seqOp (seqOp seqStart (term ",")) As)))
|
||||||
|
) (parse As))
|
||||||
|
_ (println "parse result for a " (just_aa_parser "a"))
|
||||||
|
_ (println "parse result for b " (just_aa_parser "b"))
|
||||||
|
_ (println "parse result for aa " (just_aa_parser "aa"))
|
||||||
|
_ (println "parse result for ba " (just_aa_parser "ba"))
|
||||||
|
_ (println "parse result for ab " (just_aa_parser "ab"))
|
||||||
|
_ (println "parse result for a,a " (just_aa_parser "a,a"))
|
||||||
|
_ (println "parse result for a,a,a " (just_aa_parser "a,a,a"))
|
||||||
|
|
||||||
) nil))
|
) nil))
|
||||||
|
|||||||
93
k_prime.krak
93
k_prime.krak
@@ -46,6 +46,15 @@ obj KPEnv (Object) {
|
|||||||
destruct()
|
destruct()
|
||||||
copy_construct(&other)
|
copy_construct(&other)
|
||||||
}
|
}
|
||||||
|
fun operator<(other: ref KPEnv):bool {
|
||||||
|
if data.keys < other.data.keys || data.values < other.data.values {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (outer != null<KPEnv>()) && ((other.outer == null<KPEnv>()) || (*outer < *other.outer)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
fun set(key: str, val: KPValue) {
|
fun set(key: str, val: KPValue) {
|
||||||
data.set(key, val)
|
data.set(key, val)
|
||||||
}
|
}
|
||||||
@@ -117,6 +126,9 @@ obj KPBuiltinCombiner (Object) {
|
|||||||
fun operator==(other: ref KPBuiltinCombiner):bool {
|
fun operator==(other: ref KPBuiltinCombiner):bool {
|
||||||
return name == other.name
|
return name == other.name
|
||||||
}
|
}
|
||||||
|
fun operator<(other: ref KPBuiltinCombiner):bool {
|
||||||
|
return name < other.name
|
||||||
|
}
|
||||||
fun call(params: vec<KPValue>, dynamic_env: KPValue): pair<*KPEnv, KPResult> {
|
fun call(params: vec<KPValue>, dynamic_env: KPValue): pair<*KPEnv, KPResult> {
|
||||||
if !dynamic_env.is_env() {
|
if !dynamic_env.is_env() {
|
||||||
return make_pair(null<KPEnv>(), KPResult::Err(kpString(pr_str(dynamic_env, true) + " is not an env")))
|
return make_pair(null<KPEnv>(), KPResult::Err(kpString(pr_str(dynamic_env, true) + " is not an env")))
|
||||||
@@ -178,6 +190,10 @@ obj KPCombiner (Object) {
|
|||||||
// not sure about env
|
// not sure about env
|
||||||
return env == other.env && dynamic_env_name == other.dynamic_env_name && wrap_level == other.wrap_level && parameters == other.parameters && is_variadic == other.is_variadic && body->equals(*other.body)
|
return env == other.env && dynamic_env_name == other.dynamic_env_name && wrap_level == other.wrap_level && parameters == other.parameters && is_variadic == other.is_variadic && body->equals(*other.body)
|
||||||
}
|
}
|
||||||
|
fun operator<(other: ref KPCombiner):bool {
|
||||||
|
// not sure about env
|
||||||
|
return *env < *other.env || dynamic_env_name < other.dynamic_env_name || wrap_level < other.wrap_level || parameters < other.parameters || is_variadic < other.is_variadic || body->lt(*other.body)
|
||||||
|
}
|
||||||
// no call b/c need to do in EVAL for TCO
|
// no call b/c need to do in EVAL for TCO
|
||||||
fun prep_call(params: ref vec<KPValue>, dynamic_env: KPValue): pair<*KPEnv, KPResult> {
|
fun prep_call(params: ref vec<KPValue>, dynamic_env: KPValue): pair<*KPEnv, KPResult> {
|
||||||
for (var l = 0; l < wrap_level; l++;) {
|
for (var l = 0; l < wrap_level; l++;) {
|
||||||
@@ -268,6 +284,45 @@ obj KPValue (Object) {
|
|||||||
}
|
}
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
fun variant(): int {
|
||||||
|
match (internal) {
|
||||||
|
KPValue_int::Array(d) { return 0; }
|
||||||
|
KPValue_int::String(d) { return 1; }
|
||||||
|
KPValue_int::Int(d) { return 2; }
|
||||||
|
KPValue_int::Symbol(d) { return 3; }
|
||||||
|
KPValue_int::Combiner(d) { return 4; }
|
||||||
|
KPValue_int::BuiltinCombiner(d) { return 5; }
|
||||||
|
KPValue_int::Env(e) { return 6; }
|
||||||
|
KPValue_int::True() { return 7; }
|
||||||
|
KPValue_int::False() { return 8; }
|
||||||
|
KPValue_int::Nil() { return 9; }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fun operator<(other: ref KPValue):bool {
|
||||||
|
return this->lt(other)
|
||||||
|
}
|
||||||
|
fun lt(other: ref KPValue): bool {
|
||||||
|
var our_variant = variant()
|
||||||
|
var their_variant = other.variant()
|
||||||
|
if our_variant < their_variant {
|
||||||
|
return true;
|
||||||
|
} else if our_variant > their_variant {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
match (internal) {
|
||||||
|
KPValue_int::Array(d) { match (other.internal) { KPValue_int::Array(db) { return d.get() < db.get(); } } }
|
||||||
|
KPValue_int::String(d) { match (other.internal) { KPValue_int::String(db) { return d < db; } } }
|
||||||
|
KPValue_int::Int(d) { match (other.internal) { KPValue_int::Int(db) { return d < db; } } }
|
||||||
|
KPValue_int::Symbol(d) { match (other.internal) { KPValue_int::Symbol(db) { return d < db; } } }
|
||||||
|
KPValue_int::Combiner(d){ match (other.internal) { KPValue_int::Combiner(db) { return d < db; } } }
|
||||||
|
KPValue_int::BuiltinCombiner(d) { match (other.internal) { KPValue_int::BuiltinCombiner(db) { return d < db; } } }
|
||||||
|
KPValue_int::Env(e) { match (other.internal) { KPValue_int::Env(eb) { return e < eb; } } }
|
||||||
|
KPValue_int::True() { match (other.internal) { KPValue_int::True() { return false; } } }
|
||||||
|
KPValue_int::False() { match (other.internal) { KPValue_int::False() { return false; } } }
|
||||||
|
KPValue_int::Nil() { match (other.internal) { KPValue_int::Nil() { return false; } } }
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
fun deep_clone(): KPValue {
|
fun deep_clone(): KPValue {
|
||||||
match (internal) {
|
match (internal) {
|
||||||
KPValue_int::Array(v) {
|
KPValue_int::Array(v) {
|
||||||
@@ -1100,25 +1155,33 @@ fun main(argc: int, argv: **char): int {
|
|||||||
}));
|
}));
|
||||||
|
|
||||||
env->set(str("="), make_builtin_combiner(str("="), 1, false, fun(params: vec<KPValue>, dynamic_env: *KPEnv): pair<*KPEnv, KPResult> {
|
env->set(str("="), make_builtin_combiner(str("="), 1, false, fun(params: vec<KPValue>, dynamic_env: *KPEnv): pair<*KPEnv, KPResult> {
|
||||||
if params.size != 2 {
|
if params.size <= 1 {
|
||||||
return make_pair(null<KPEnv>(), KPResult::Err(kpString(str("Need 2 params to ="))))
|
return make_pair(null<KPEnv>(), KPResult::Err(kpString(str("Need 2 or more params to ="))))
|
||||||
}
|
}
|
||||||
return make_pair(null<KPEnv>(), KPResult::Ok(kpBool(params[0].equals(params[1]))))
|
for (var i = 0; i < params.size - 1; i++;) {
|
||||||
|
if !(params[i].equals(params[i+1])) {
|
||||||
|
return make_pair(null<KPEnv>(), KPResult::Ok(kpBool(false)))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return make_pair(null<KPEnv>(), KPResult::Ok(kpBool(true)))
|
||||||
}));
|
}));
|
||||||
env->set(str("!="), make_builtin_combiner(str("!="), 1, false, fun(params: vec<KPValue>, dynamic_env: *KPEnv): pair<*KPEnv, KPResult> {
|
env->set(str("!="), make_builtin_combiner(str("!="), 1, false, fun(params: vec<KPValue>, dynamic_env: *KPEnv): pair<*KPEnv, KPResult> {
|
||||||
if params.size != 2 {
|
if params.size <= 1 {
|
||||||
return make_pair(null<KPEnv>(), KPResult::Err(kpString(str("Need 2 params to !="))))
|
return make_pair(null<KPEnv>(), KPResult::Err(kpString(str("Need 2 or more params to !="))))
|
||||||
}
|
}
|
||||||
return make_pair(null<KPEnv>(), KPResult::Ok(kpBool(!params[0].equals(params[1]))))
|
for (var i = 0; i < params.size - 1; i++;) {
|
||||||
|
if (params[i].equals(params[i+1])) {
|
||||||
|
return make_pair(null<KPEnv>(), KPResult::Ok(kpBool(false)))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return make_pair(null<KPEnv>(), KPResult::Ok(kpBool(true)))
|
||||||
}));
|
}));
|
||||||
env->set(str("<"), make_builtin_combiner(str("<"), 1, false, fun(params: vec<KPValue>, dynamic_env: *KPEnv): pair<*KPEnv, KPResult> {
|
env->set(str("<"), make_builtin_combiner(str("<"), 1, false, fun(params: vec<KPValue>, dynamic_env: *KPEnv): pair<*KPEnv, KPResult> {
|
||||||
if params.size <= 1 {
|
if params.size <= 1 {
|
||||||
return make_pair(null<KPEnv>(), KPResult::Err(kpString(str("Need 2 or more params to <"))))
|
return make_pair(null<KPEnv>(), KPResult::Err(kpString(str("Need 2 or more params to <"))))
|
||||||
}
|
}
|
||||||
if !params[0].is_int() { return make_pair(null<KPEnv>(), KPResult::Err(kpString(str("called < with first not an int ") + pr_str(params[0], true) + "\nenv was\n" + dynamic_env->to_string()))); }
|
|
||||||
for (var i = 0; i < params.size - 1; i++;) {
|
for (var i = 0; i < params.size - 1; i++;) {
|
||||||
if !params[i+1].is_int() { return make_pair(null<KPEnv>(), KPResult::Err(kpString(str("called < with param ") + (i+1) + " not an int " + pr_str(params[i+1], true)))); }
|
if !(params[i].lt(params[i+1])) {
|
||||||
if !(params[i].get_int() < params[i+1].get_int()) {
|
|
||||||
return make_pair(null<KPEnv>(), KPResult::Ok(kpBool(false)))
|
return make_pair(null<KPEnv>(), KPResult::Ok(kpBool(false)))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1128,10 +1191,8 @@ fun main(argc: int, argv: **char): int {
|
|||||||
if params.size <= 1 {
|
if params.size <= 1 {
|
||||||
return make_pair(null<KPEnv>(), KPResult::Err(kpString(str("Need 2 or more params to <="))))
|
return make_pair(null<KPEnv>(), KPResult::Err(kpString(str("Need 2 or more params to <="))))
|
||||||
}
|
}
|
||||||
if !params[0].is_int() { return make_pair(null<KPEnv>(), KPResult::Err(kpString(str("called <= with first not an int")))); }
|
|
||||||
for (var i = 0; i < params.size - 1; i++;) {
|
for (var i = 0; i < params.size - 1; i++;) {
|
||||||
if !params[i+1].is_int() { return make_pair(null<KPEnv>(), KPResult::Err(kpString(str("called <= with not an int")))); }
|
if !(params[i].lt(params[i+1])) && !(params[i].equals(params[i+1])) {
|
||||||
if !(params[i].get_int() <= params[i+1].get_int()) {
|
|
||||||
return make_pair(null<KPEnv>(), KPResult::Ok(kpBool(false)))
|
return make_pair(null<KPEnv>(), KPResult::Ok(kpBool(false)))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1141,10 +1202,8 @@ fun main(argc: int, argv: **char): int {
|
|||||||
if params.size <= 1 {
|
if params.size <= 1 {
|
||||||
return make_pair(null<KPEnv>(), KPResult::Err(kpString(str("Need 2 or more params to >"))))
|
return make_pair(null<KPEnv>(), KPResult::Err(kpString(str("Need 2 or more params to >"))))
|
||||||
}
|
}
|
||||||
if !params[0].is_int() { return make_pair(null<KPEnv>(), KPResult::Err(kpString(str("called > with first not an int")))); }
|
|
||||||
for (var i = 0; i < params.size - 1; i++;) {
|
for (var i = 0; i < params.size - 1; i++;) {
|
||||||
if !params[i+1].is_int() { return make_pair(null<KPEnv>(), KPResult::Err(kpString(str("called > with param ") + (i+1) + " not an int " + pr_str(params[i+1], true)))); }
|
if params[i].lt(params[i+1]) || params[i].equals(params[i+1]) {
|
||||||
if !(params[i].get_int() > params[i+1].get_int()) {
|
|
||||||
return make_pair(null<KPEnv>(), KPResult::Ok(kpBool(false)))
|
return make_pair(null<KPEnv>(), KPResult::Ok(kpBool(false)))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1154,10 +1213,8 @@ fun main(argc: int, argv: **char): int {
|
|||||||
if params.size <= 1 {
|
if params.size <= 1 {
|
||||||
return make_pair(null<KPEnv>(), KPResult::Err(kpString(str("Need 2 or more params to >="))))
|
return make_pair(null<KPEnv>(), KPResult::Err(kpString(str("Need 2 or more params to >="))))
|
||||||
}
|
}
|
||||||
if !params[0].is_int() { return make_pair(null<KPEnv>(), KPResult::Err(kpString(str("called >= with first not an int")))); }
|
|
||||||
for (var i = 0; i < params.size - 1; i++;) {
|
for (var i = 0; i < params.size - 1; i++;) {
|
||||||
if !params[i+1].is_int() { return make_pair(null<KPEnv>(), KPResult::Err(kpString(str("called >= with not an int")))); }
|
if params[i].lt(params[i+1]) {
|
||||||
if !(params[i].get_int() >= params[i+1].get_int()) {
|
|
||||||
return make_pair(null<KPEnv>(), KPResult::Ok(kpBool(false)))
|
return make_pair(null<KPEnv>(), KPResult::Ok(kpBool(false)))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -223,6 +223,9 @@ obj str (Object, Serializable, Hashable) {
|
|||||||
r++
|
r++
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
fun operator<(other: ref str): bool {
|
||||||
|
return *this <= other && *this != other
|
||||||
|
}
|
||||||
|
|
||||||
fun operator*(n: int): str {
|
fun operator*(n: int): str {
|
||||||
var to_ret.construct(): str
|
var to_ret.construct(): str
|
||||||
|
|||||||
@@ -207,6 +207,16 @@ obj vec<T> (Object, Serializable) {
|
|||||||
return false
|
return false
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
fun operator< <U>(other: ref vec<U>):bool {
|
||||||
|
if (size < other.size)
|
||||||
|
return true
|
||||||
|
if (size > other.size)
|
||||||
|
return false
|
||||||
|
for (var i = 0; i < size; i++;)
|
||||||
|
if (data[i] < other.data[i]) // it's !(==) because we want equality if our members are equal, and overloading etc
|
||||||
|
return true
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
fun set(index: int, dataIn: ref T): void {
|
fun set(index: int, dataIn: ref T): void {
|
||||||
if (index < 0 || index >= size)
|
if (index < 0 || index >= size)
|
||||||
|
|||||||
Reference in New Issue
Block a user