2010-08-16 4 views
4

Я пытался узнать OMeta, используя OMeta/JS, и я, кажется, зацикливаюсь на чем-то, что должно быть очень просто. Если у меня есть грамматикуКак совместить слово с OMetaJS?

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 грамматику к выходу «привет»?

ответ

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') 
+0

Это ошибка, которая, вероятно, уже решена. Я проверил ваш пример на моей тестовой странице oMeta (http://ruediger-plantiko.net/ometa/), и он работает без знака равенства (нужно вызвать объект M на моей тестовой странице, но это не имеет значения). – rplantiko

Смежные вопросы