Allez - Comment créer un parser
Je veux construire un analyseur syntaxique, mais certains ont des problèmes de compréhension de la façon de le faire.
Exemple de chaîne, je voudrais analyser
{key1 = value1 | key2 = {key3 = value3} | key4 = {key5 = { key6 = value6 }}}
De préférence, je voudrais obtenir un résultat similaire à un imbriquée carte
map[key1] = value1
map[key2] = (map[key3] = value3)
map[key4] = (map[key5] = (map[key6] = value6))
Comment cela pourrait-il être fait? Suis-je en visant dans la mauvaise direction?
- Plus facile si vous le faites à partir d'ebnf -> yacc, puis la saveur avec lex, Exemple, noypi-linux.blogspot.com/2014/07/...
Vous devez vous connecter pour publier un commentaire.
D'écrire un analyseur syntaxique est un sujet compliqué qui est trop grand pour couvrir en une seule et unique réponse.
Rob Pike a donné un excellent exposé qui marche à travers la rédaction d'un analyseur lexical (qui est une moitié de l'analyseur) en Go: http://www.youtube.com/watch?v=HxaD_trXwRE
Vous devriez aussi regarder par exemple un analyseur de code à Aller à la bibliothèque standard pour un exemple sur la façon de le faire: http://golang.org/src/pkg/go/parser/parser.go
Il y a aussi beaucoup de ressources sur l'analyse sur l'internet. Ils pourraient avoir des exemples dans d'autres langues, mais c'est juste une question de la traduction de la syntaxe Aller.
Je vous recommande la lecture sur récursive descente d'analyse (par exemple,http://www.cs.binghamton.edu/~zdu/parsdemo/recintro.html) ou de haut en bas l'analyse (par exemple,http://javascript.crockford.com/tdop/tdop.html, http://effbot.org/zone/simple-top-down-parsing.htm).
Que sur l'utilisation de la norme goyacc outil? Voici un squelette:
principal.y
Sortie
Être informé que, avec Go 1.8 (actuellement en version bêta au 4ème trimestre 2016, publié au 1er trimestre 2017)
Ce format est très similaire à du json. Vous pouvez utiliser le code suivant pour tirer parti de cette similitude:
Si vous êtes prêt à convertir vos commentaires à un standard de format JSON, pourquoi créer un parser quand il y a des Aller bibliothèques qui ne le levage lourd pour vous?
Le suivant fichier d'entrée (/Users/lex/dev/go/data/jsoncfgo/fritjof.json):
Fichier D'Entrée
Exemple De Code
Sortie
Notes
jsoncfgo peut gérer n'importe quel niveau d'imbrication des objets JSON.
Pour plus de détails voir:
Aimeriez-vous essayer de parsec pour golang édition? J'écris une rune(unicode) fourchette de goparsec(https://github.com/sanyaade-buildtools/goparsec) qu'est-ce que https://github.com/Dwarfartisan/goparsec .
Haskell parsec est une puissance des outils pour faire de l'analyseur. La première perl6 analyseur nommé carlins a été écrit par lui. Mon golang Édition n'est pas simple de yacc, mais il est plus facile que yacc.
Pour cet exemple, j'ai écrit le code comme ceci:
de l'analyseur.aller
EXÉCUTER
SORTIE
Cette démo inclure échapper, jeton, de la chaîne et clé/valeur de la carte. Vous pouvez créer un analyseur de paquet ou de l'application.