我如何与OMetaJS匹配单词?

时间:2010-08-16 17:30:59

标签: parsing ometa

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

1 个答案:

答案 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')