Как мне сопоставить слово с OMetaJS?
Я пытался изучить OMeta, используя OMeta/JS, и мне кажется, что я застрял на чем-то, что должно быть действительно простым. Если у меня есть грамматика
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 для вывода "привет"?
1 ответ
Решение
Ну, я понял, как получить желаемый результат. Ответ здесь, хотя я до сих пор не понимаю, почему 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')