Cela fait longtemps que j'essaie de me procurer un analyseur dans JavaScript pour org-mode . Je n'avais aucun problème à l'analyse du contour (que j'ai fait dans quelques minutes), mais l'analyse du contenu réel est beaucoup plus difficile, et j'ai des problèmes avec des listes imbriquées, par exemple.
* This is a heading P1 Start a paragraph here but since it is the first indentation level the paragraph may have a lower indentation on the next line or a greater one for that matter. + LI1.1 I am beginning a list here + LI1.2 Here begins another list item which continues here and also here P2 but is broken here (this line becomes a paragraph outside of the first list). + LI2.1 P1 Second list item. - LI2.1.1 Inner list with a simple item - LI2.1.2 P1 and with an item containing several paragraphs. Here is the second line in the item, and now LI2.1.2 P2 I begin a new paragraph still in the same item. The indentation can be only higher LI2.1 P2 but if the indentation is lower, it breaks the item, (and the whole list), and this is a paragraph in the LI2.1 list item - LI 2.2.1 You get the picture P3 Just plain text outside of the list.
3 Réponses :
Comme je l'ai dit dans les commentaires, ce sera une douleur à analyser cela, de même que beaucoup de telles langues similaires à Wiki. P>
Si vous allez écrire une grammaire et que vous laissez un générateur d'analyseur créer un analyseur pour vous, opposé à la rédaction d'un analyseur, il existe différentes options. Pour énumérer quelques: p>
Je sais qu'AnTLR peut faire cela, mais ce ne sera pas trivial et, en plus de cela, vous devrez vous familiariser avec l'outil (qui sera em> prendre un peu de temps !). Je n'ai pas passé trop de temps sur les deux autres outils, mais je doute qu'ils seront à la hauteur du travail avec une langue aussi méchante. P>
aller pour un analyseur écrit à la main vous donnera un démarrage rapide, mais le débogage, l'amélioration ou la réécriture de la réécriture sera difficile. Écrire une grammaire et laisser un générateur d'analyseur créer l'analyseur pour que vous puissiez déboguer, améliorer et réécrire l'analyseur (à travers la grammaire), mais vous devrez dépenser (tout à fait) un peu de temps d'apprentissage à utiliser l'outil. p>
Un analyseur écrit à la main sera (le plus probable) être plus rapide que celui généré, s'il est écrit correctement, bien sûr. Mais la différence entre eux pourrait seulement être perceptible avec de gros morceaux de source. P>
Désolé, je n'ai pas de stratégie générale comment gérer cela avec un analyseur écrit à la main. P>
Bonne chance! P>
+1 pour Jison. Vous devez juste utiliser un bon vieux port Lex / Yacc pour faire l'analyse.
@RAYNOS, OK, mais cela ne répond pas exactement à la manière de traiter avec des espaces blancs importants, en particulier lorsque des articles de LI ont cette particularité d'avoir une indentation différente pour leur première ligne et des lignes suivantes (voir exemple dans la question).
@subtenante Achetez le livre Dragon . Puis lisez-le. Puis résolvez votre problème avec votre incroyable connaissance du compilateur.
@Raynos Pourquoi taper tant de caractères? Vous avez pu simplement avoir dit "juste résoudre votre problème". : p
@subtenante, si vous êtes intéressé, je pourrais poster une petite démonstration de la façon d'analyser cela en utilisant ANTLR (et la cible JavaScript, bien sûr). Par petit, je voulais dire pas i> le mode org complet, mais le petit extrait d'exemple que vous avez affiché. Cependant, si vous savez déjà que vous êtes pas i> Allez utiliser ANTLR, je ne me dérangerai pas. Faites-moi savoir et je vais essayer de cuisiner quelque chose de ce soir (je suis dans le CET).
@Bart Oui, je suis intéressé. L'exemple que j'ai donné est vraiment les bases, je m'attends à avoir des tonnes d'autres difficultés plus tard, ce que je ne vous dérangerai pas. :) Mais oui, si vous pouviez me sauver la peine de lire le livre de dragon pour me faire commencer, j'apprécierais beaucoup.
@subtenante, désolé, je ne peux pas le faire ce soir: j'ai essayé de pirater quelque chose rapidement, mais mon javascript-vaudou est assez rouillé ... je
@Bart, pas de soucis, cela peut attendre. Merci d'avoir pris le temps de toute façon. :)
@subtenante, j'ai une grammaire d'antlr en Java qui analyse cela, mais il utilise un code Java tout à fait intégré que je ne peux pas être porté à JavaScript. Je ne posterai pas la grammaire parce que c'est un désordre approprié qui me prendrait un peu de temps à expliquer. Je savais que ce serait désordonné, mais je ne m'attendais pas au désordre que je vois maintenant devant moi! :)
Oh, et je viens de vous voir attaché une prime à votre question qui se termine en deux jours. Si personne d'autre ne fournit une meilleure réponse à ce moment-là, assurez-vous de l'attribuer à Luc1245 sinon cela pourrait être automatiquement attribué à moi car ma réponse a plus de votes.
@Bart: Je suis vraiment intéressé à voir la grammaire quand même. Peut-être que vous pourriez l'envoyer à mon compte Gmail? (Même nom du compte comme mon nom ici.) Je suis compétent avec Java afin qu'il n'y ait aucun problème à ce sujet.
J'aime les analyseurs et la théorie du compilateur, j'ai donc écrit un petit parseur (à la main) qui est capable d'analyser votre exemple d'extrémité dans un objet de document XML DOM. Il sera possible de le modifier de manière à produire un autre type de structure d'arborescence, comme une zone AST personnalisée (arborescence de syntaxe abstraite).
J'ai essayé de garder le code facile à lire, de sorte que vous puissiez voir comment un tel analyseur fonctionne. P>
Demandez-moi si vous avez besoin de plus d'explications ou que vous voulez le modifier un peu . P>
avec votre exemple d'extrémité comme entrée, l'instruction Le code: p> résultat = nouveau orgmodparser (). Parse (entrée); résultat.xml code> retourné: p>
Pas mal, c'est un peu mieux que j'étais (car cela fonctionne (presque) comme je m'attends à :)), mais j'étais assez réticent à compter sur le Dom, d'abord parce que je m'attends à utiliser l'analyseur en dehors d'un navigateur et Deuxièmement, certaines autres caractéristiques d'org-mode ne peuvent pas être insérées dans le modèle DOM, comme cela. (J'ai dit presque comme je m'attends, car le LI2.1.2 devrait avoir deux paragraphes: les prarions sont brisées sur une double ligne.)
Merci pour votre avis. J'ai corrigé le double bogue de rupture de ligne pour les paragraphes et modifié le type de sortie sur un objet XML afin qu'il n'a pas besoin d'un navigateur pour fonctionner.
Merci. Vous me trouverez assez ennuyeux, mais vous comptez sur Windows ActiveX, n'est pas bien meilleur que de compter sur les navigateurs ... :) Je reçois le gist de votre proposition cependant.
Non, je ne trouve pas que vous devriez être ennuyeux ... Le code que j'ai posté n'est pas une solution complète qui fonctionne sur chaque plate-forme JS, un exemple de la manière de faire face aux blocs et aux espaces blancs imbriqués, sans utiliser de nombreuses regextes. C'est pourquoi j'ai utilisé un objet DOM ou XML, cela m'a permis d'écrire moins de méthodes, ce qui rend le code plus court et plus facile à comprendre. Quoi qu'il en soit, il est facile de porter à n'importe quelle plate-forme qui prend en charge XML. Mais si vous avez besoin d'un analyseur entièrement portable, il utilisera une structure pure JS Tree au lieu d'un objet XML. Si vous souhaitez que je l'écrive ou que vous écrivez des explications sur l'algorithme, dites-moi.
J'ai récompensé la prime à cette réponse pour l'effort donné, que j'apprécie vraiment. Le problème que j'ai avec cette réponse est qu'il ressemble beaucoup à l'endroit où j'étais et ajoutant plus de fonctionnalités à l'analyseur pourrait devenir très désordonné. Mais alors que Bart déclare qu'une grammaire doit être désordonnée de toute façon pour ce genre de langue, je prends la réponse à ma question: "Eh bien, c'est compliqué, essayez plus". :) Merci beaucoup à la fois à Luc et Bart.
Afaik, il n'y a pas de moyen simple de l'analyser. Ce formatage semblable à Wiki est juste une douleur dans le @ $$ à gérer. Allez-vous écrire un analyseur ou écrivez-vous / traduisez-vous une grammaire et laissez-vous un générateur d'analyseur créer un analyseur pour vous?
Eh bien, votre commentaire suggère que je le code à la main, que j'ai déjà commencé à faire, mais j'ai déjà manqué de trouver la bonne manière. Peut-être écrire une grammaire serait plus facile, mais je ne saurais pas comment gérer les espaces importants. Je suis nouveau à analyser, alors j'ai heurté un mur sur tout ce que j'ai essayé jusqu'à présent. :)
Y a-t-il une grammaire formelle écrite quelque part? Le problème me semble que vous n'avez pas de jeton pour mettre fin à une déclaration. Plusieurs langues utilisent le formatage de l'espace blanc au lieu de semi-couches et d'accolades, mais je ne peux penser à aucun qui vous permet de mettre en forme comme votre exemple pour P1 avec n'importe quel degré d'indentation après la première ligne.
@Samsdran: Il n'y a pas de grammaire que je connais de ...