我一直在尝试使用OMeta/JS学习OMeta,而我似乎陷入了一些非常简单的事情。如果我有语法
ometa L <: Parser {
l letter:l -> l
}
L.match('h', 'l')
它产生预期的输出
h
我也可以使用
ometa W1 <: Parser {
ls letter*:ls -> ls
}
W1.matchAll('hi', 'ls')
哪个产生
[h, i]
但是当我尝试使用
解析整个单词时ometa W2 <: Parser {
word letter:l word:w -> (l + w)
| letter:l -> l
}
W2.match('hi', 'word')
//Also tried W2.matchAll('hi', 'word')
我收到错误
match failed { errorPos=61 }
我误解了什么,如何修复W2语法输出'hi'?
答案 0 :(得分:4)
好吧,我想出了如何得到我想要的结果。答案就在这里,虽然我仍然不明白为什么W2不起作用。我将暂时保持开放状态,并希望有人能够回答这个问题。
ometa W3 <: Parser {
word letter*:w -> w.join('')
}
W3.matchAll('hi', 'word')
再次回来:似乎可能使用速记来取消等号导致错误。添加它会产生正确的答案。
ometa W2 <: Parser {
word = letter:l word:w -> (l + w)
| letter:l -> l
}
W2.matchAll('hi', 'word')