moving computers. Parser still not quite right
This commit is contained in:
@@ -287,15 +287,32 @@ obj parser (Object) {
|
|||||||
} else {
|
} else {
|
||||||
if (!are_packed(parent->children)) {
|
if (!are_packed(parent->children)) {
|
||||||
// ambiguity inner
|
// ambiguity inner
|
||||||
|
var sub_parent = new<tree<symbol>>()->construct(symbol("AmbiguityInner", true))
|
||||||
|
set_packed(sub_parent, true)
|
||||||
|
sub_parent->children.add_all(parent->children)
|
||||||
|
parent->children.clear()
|
||||||
|
parent->children.add(sub_parent)
|
||||||
}
|
}
|
||||||
// ambiguity outer
|
// ambiguity outer
|
||||||
|
var next_sub_parent = new<tree<symbol>>()->construct(symbol("AmbiguityOuter", true))
|
||||||
|
set_packed(next_sub_parent, true)
|
||||||
|
parent->children.add(next_sub_parent)
|
||||||
|
next_sub_parent->children.add_all(children)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
fun belongs_to_family(node: *tree<symbol>, nodes: vector<*tree<symbol>>): bool {
|
fun belongs_to_family(node: *tree<symbol>, nodes: vector<*tree<symbol>>): bool {
|
||||||
return false
|
var family_count = 0
|
||||||
|
node->children.for_each(fun(child: *tree<symbol>) {
|
||||||
|
if (nodes.contains(child))
|
||||||
|
family_count++
|
||||||
|
})
|
||||||
|
return family_count == nodes.size
|
||||||
}
|
}
|
||||||
fun are_packed(nodes: vector<*tree<symbol>>): bool {
|
fun are_packed(nodes: vector<*tree<symbol>>): bool {
|
||||||
return true
|
return nodes.any_true(fun(it: *tree<symbol>):bool { return packed_map.contains_key(it) && packed_map[it]; })
|
||||||
|
}
|
||||||
|
fun set_packed(node: *tree<symbol>, packed: bool) {
|
||||||
|
packed_map.set(node, packed)
|
||||||
}
|
}
|
||||||
fun fully_reduces_to_null(r: ref rule): bool {
|
fun fully_reduces_to_null(r: ref rule): bool {
|
||||||
return r.position == 0 && gram.first_vector(r.rhs).contains(null_symbol())
|
return r.position == 0 && gram.first_vector(r.rhs).contains(null_symbol())
|
||||||
|
|||||||
@@ -52,7 +52,8 @@ fun main():int {
|
|||||||
println(a.to_string())
|
println(a.to_string())
|
||||||
a.calculate_state_automaton()
|
a.calculate_state_automaton()
|
||||||
var parse.construct(a): parser
|
var parse.construct(a): parser
|
||||||
var result = parse.parse_input(string("fun main():int { return 0; }"), string("fun name"))
|
var result = parse.parse_input(string("inport a;"), string("fun name"))
|
||||||
|
/*var result = parse.parse_input(string("fun main():int { return 0; }"), string("fun name"))*/
|
||||||
/*var result = parse.parse_input(string("ad"), string("fun name"))*/
|
/*var result = parse.parse_input(string("ad"), string("fun name"))*/
|
||||||
/*var result = parse.parse_input(string("hibyed"), string("fun name"))*/
|
/*var result = parse.parse_input(string("hibyed"), string("fun name"))*/
|
||||||
/*var result = parse.parse_input(string("hmmhmm"), string("fun name"))*/
|
/*var result = parse.parse_input(string("hmmhmm"), string("fun name"))*/
|
||||||
|
|||||||
Reference in New Issue
Block a user