2010-01-16 7 views
1

Je veux analyser un flux continu d'octets (à partir d'une prise) avec une machine d'état à l'aide RagelEncapsulation d'un analyseur Ragel (Ruby pur) pour des flux infinis?

Cependant, tous les exemples que j'ai trouvé sont l'analyse syntaxique soit un dossier complet en une seule passe (comme the Gherkin lexer ou utilisent Ragels C cible (comme le mongrel HTTP1.1 Parser)

Je cherche des conseils ou des exemples sur la façon de instancier une machine d'Etat Ragel puis ajouter octets à elle, en gardant l'état actuel intact.

l'interface finale, je suis la recherche est quelque chose comme:

parser = MyStreamParser.new(Grammar) 
parser.on_token { |t| puts t.inspect } 

# I can't parse lines seperately because tokens can span multiple lines. 
$stdin.each_line do |line| 
    parser.add(line) 
end 

Un conseil sur la façon de le faire dans Ragel est grandement apprécié. Je préfère utiliser cela que de coder une autre machine d'état à la main.

Peut-être que Ragel n'est pas le bon outil? Si non: Que devrais-je utiliser à la place?

Répondre

0

Il se peut que ce ne soit pas exactement ce que vous recherchez, mais Dhaka est un autre générateur de parseur décent à regarder. Je ne suis pas sûr que cela aidera, mais cela m'a bien servi dans le passé.

1

A première vue, Ragel n'a pas l'air très rubis. Avez-vous jeté un coup d'oeil à Statemachine? Il semble que vous pouvez nourrir les événements de la machine d'état (caractères, dans votre problème) un à la fois.

+0

Oh, ouais. Roches Statemachine. Je suis en train de remplacer l'un des moteurs d'état faits à la main par Statemachine. –

+0

Statemachine est sympa pour ce qu'elle fait, mais elle (je crois) ne possède pas les fonctionnalités que je voudrais (j'aurais encore besoin d'une lexeur pour convertir mon flux d'octets en jetons et elle ne peut pas faire des choses comme lookahead , conditions sémantiques sauf si je les construis moi-même) – levinalex

+0

Assez juste. Désolé, cela ne vous a pas aidé. Mais merci d'avoir posé une question sympa. –

Questions connexes