Je suis en train de faire un analyseur récursif-descente en Ruby pour une grammaire, qui est définie par les règles suivantesParser en Ruby: traiter des commentaires collants et citations
- entrée se compose de blanc- espace séparé Cartes commençant par un arrêt mot, où white-space est regex
/[ \n\t]+/
- carte peut consister en Mots-clés et/ou valeurs également séparés par des espaces blancs, qui ont ordre spécifique de carte/motif
- Tous les stop-mots et mots-clés sont insensibles à la casse, à savoir:
/^[a-z]+[a-z0-9]*$/i
La valeur peut être chaîne double cité, qui peut être séparé de ne pas d'autres termes par un espace blanc, par exemple:
word"quoted string"word
la valeur peut aussi être un mot
/^[a-z]+[a-z0-9]*$/
, ou entier, ou flotteur (par ex.-1.15
ou1.0e+2
)commentaire sur une ligne est désignée par
#
et peut ne pas être séparé de d'autres termes, par exemple:word#single-line comment\n
commentaire multi-ligne est désignée par
/*
et*/
et peut ne pas être séparé des autres mots, p.ex.:word/*multi-line comment*/word
# Input example. Stop-words are chosen just to highlight them: set, object
set title"Input example"set objects 2#not-separated by white-space. test: "/*
set test "#/*"
object 1 shape box/* shape is a Keyword,
box is a Value. test: "#*/object 2 shape sphere
set data # message and complete are Values
0 0 0 0 1 18 18 18 1 35 35 35 72 35 35 # all numbers are Values of the Card "set"
Puisque la plupart des mots sont séparés par des espaces blancs, pendant un certain temps, je pensais à diviser l'entrée entier et l'analyse syntaxique mot par mot. Pour faire face à des commentaires et des citations, j'allais faire
words = input_text.gsub(/([\"\#\n]|\/\*|\*\/)/, ' \1 ').split(/[ \t]+/)
Cependant, de cette manière le contenu des chaînes (et commentaires, si je veux les garder) est modifié. Comment traiteriez-vous ces commentaires et citations?
En relation avec http://stackoverflow.com/questions/3343726/parser-in-ruby-slice-inside-each-with-index-missing-element – Andrei
Je ne crois pas que le découpage de texte sur les espaces blancs soit un bonne idée pour analyser tout sauf les grammaires les plus simples. Je ne veux pas écrire un essai sur la création de parseurs ici ... Quoi qu'il en soit, google pour "compilateur compilateur ruby", "parser génération ruby" ... Ceci est un exemple http://treetop.rubyforge.org/ – skalee
Bien , la cime des arbres est un peu difficile à comprendre. Peut-être pouvez-vous me montrer comment je peux l'appliquer à ma grammaire? Je pensais que pour une grammaire aussi facile je pourrais faire quelque chose moi-même avec l'aide aimable des utilisateurs SO. – Andrei