毕设专用git仓库
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

111 lines
2.5 KiB

OMeta._or = function() {
for (var idx = 0; idx < arguments.length; idx++) {
var ok = true
in thisWorld.sprout() {
try { return arguments[idx]() }
catch (f) {
ok = false
if (f != fail)
throw f
}
finally { if (ok) thisWorld.commit() }
}
}
throw fail
}
OMeta._many = function(x) {
var ans = arguments[1] != undefined ? [arguments[1]] : []
while (true) {
in thisWorld.sprout() {
try {
ans.push(x())
//print("committing " + ans.toString())
thisWorld.commit()
}
catch (f) {
if (f != fail)
throw f
break
}
}
}
return ans
}
OMeta._not = function(x) {
in thisWorld.sprout() {
try { x() }
catch (f) {
if (f != fail)
throw f
return true
}
}
throw fail
}
/*
OMeta._lookahead = function(x) {
in thisWorld.sprout() {
var r = x()
//print("la = " + r.toString())
return x
}
}
*/
/*
OMeta._apply = function(rule) {
var memoRec = this.input.memo[rule]
if (memoRec == undefined) {
var origInput = this.input,
failer = new Failer()
this.input.memo[rule] = failer
this.input.memo[rule] = memoRec = {ans: this[rule].apply(this), nextInput: this.input}
if (failer.used) {
var sentinel = this.input
while (true) {
try {
this.input = origInput
var ans = this[rule].apply(this)
if (this.input == sentinel)
throw fail
memoRec.ans = ans
memoRec.nextInput = this.input
}
catch (f) {
if (f != fail)
throw f
break
}
}
}
}
else if (memoRec instanceof Failer) {
memoRec.used = true
throw fail
}
this.input = memoRec.nextInput
return memoRec.ans
}
*/
print("defining example 1")
eval(BSOMetaJSTranslator.match(BSOMetaJSParser.matchAll("ometa M { ones = (1 -> 2)* }", "srcElem"), "trans"))
print("running example 1")
print(M.matchAll([1, 1, 1, 1], "ones"))
print("defining example 2")
eval(BSOMetaJSTranslator.match(BSOMetaJSParser.matchAll("ometa M { foo = &(:x) anything*:ys -> [x, ys] }", "srcElem"), "trans"))
print("running example 2")
print(M.matchAll([1, 2, 3, 4], "foo"))
print("defining example 3")
eval(BSOMetaJSTranslator.match(BSOMetaJSParser.matchAll("ometa M { ones = {count=0} ({count++} 1 -> 2)* }", "srcElem"), "trans"))
print("running example 3")
print(M.matchAll([1, 1, 1, 1], "ones"))
print("count = " + count)