2010-08-16 3 views
4

J'ai essayé d'apprendre OMeta en utilisant OMeta/JS et je semble être coincé sur quelque chose qui devrait être vraiment simple. Si j'ai une grammaireComment faire correspondre un mot avec OMetaJS?

ometa L <: Parser { 
    l letter:l -> l 
} 
L.match('h', 'l') 

Il produit le résultat attendu

h 

Je peux aussi utiliser

ometa W1 <: Parser { 
    ls letter*:ls -> ls 
} 
W1.matchAll('hi', 'ls') 

qui produit

[h, i] 

Mais lorsque je tente d'analyser un mot entier en utilisant

ometa W2 <: Parser { 
    word letter:l word:w -> (l + w) 
    | letter:l -> l 
} 
W2.match('hi', 'word') 
//Also tried W2.matchAll('hi', 'word') 

Je reçois une erreur

match failed { errorPos=61 } 

Qu'est-ce que je comprends mal, et comment puis-je fixer le W2 Grammer à la sortie 'salut'?

Répondre

4

Eh bien, j'ai compris comment obtenir le résultat que je voulais. La réponse est ici, même si je ne comprends toujours pas pourquoi W2 ne fonctionne pas. Je vais laisser cela ouvert pour le moment et j'espère que quelqu'un pourra venir répondre à cette question.

ometa W3 <: Parser { 
    word letter*:w -> w.join('') 
} 
W3.matchAll('hi', 'word') 

Retour à nouveau: il semble que l'utilisation du raccourci pour quitter le signe égal a provoqué une erreur. L'ajouter produit la bonne réponse.

ometa W2 <: Parser { 
    word = letter:l word:w -> (l + w) 
     | letter:l -> l 
} 
W2.matchAll('hi', 'word') 
+0

Ceci est un bug qui a probablement déjà été résolu. J'ai vérifié votre exemple sur ma page de test oMeta (http://ruediger-plantiko.net/ometa/), et cela fonctionne sans signe égal (je dois appeler l'objet M dans ma page de test - mais ce n'est pas pertinent). – rplantiko

Questions connexes