3

我一直在尝试使用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”?

4

1 回答 1

3

好吧,我想出了如何得到我想要的结果。答案就在这里,虽然我还是不明白为什么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')
于 2010-08-16T18:27:03.883 回答