2010-06-25 23 views
0

Je suis en train de faire un correcteur de texte SINTAX pour la classe de mes compilateurs. L'idée est la suivante: j'ai des règles, qui sont inhérentes à la langue (dans mon cas, le portugais), comme « Une phrase valide est soumise VERB ADJECTIVE », comme dans « Ruby est grande ».Comment créer un analyseur qui symbolise une liste de mots extraits d'un fichier?

Ok, donc je dois d'abord tokenizer l'entrée « Ruby est grande ». J'ai donc un fichier texte "verbes", avec beaucoup de verbes, un par ligne. Ensuite, j'ai un texte « adjectifs », un « pronoms », etc.

Je suis en train d'utiliser Ragel pour créer un analyseur, mais je ne sais pas comment je pourrais faire quelque chose comme:

%%{ 
    machine test; 
    subject = <open-the-subjects-file-and-accept-each-one-of-them>; 
    verb = <open-the-verbs-file-and-accept-each-one-of-them>; 
    adjective = <open-the-adjective-file-and-accept-each-one-of-them>; 
    main = subject verb adjective @ { print "Valid phrase!" } ; 
}%% 

J'ai regardé ANTLR, Lex/Yacc, Ragel, etc. Mais je n'ai pas pu trouver celui qui semblait résoudre ce problème. La seule façon de le faire à laquelle je pouvais penser était de pré-traiter le fichier d'entrée de Ragel, afin que mon programme lise le fichier et écrit son contenu au bon endroit. Mais je n'aime pas non plus cette solution.

Est-ce que quelqu'un sait comment je pourrais le faire? Il n'y a pas de problème si ce n'est pas avec Ragel, je veux juste résoudre ce problème. Je voudrais utiliser Ruby ou Python, mais ce n'est pas vraiment nécessaire non plus.

Merci.

Répondre

0

Avec bison j'écrirait le lexer à la main, ce qui lookup les mots dans le dictionnaire prédéfini.

2

Si vous voulez lire les fichiers au moment de la compilation .. faire être du format:

subject = \ 
ruby|\ 
python|\ 
c++ 

puis utilisez la déclaration de ragel include ou « importation » (je ne sais plus quel .. doit vérifier la manuel) pour l'importer.


Si vous voulez vérifier la liste des sujets au moment de l'exécution, peut-être juste faire ragel lire 3 mots, ont alors une action associée à chaque mot. L'action peut lire le fichier et rechercher si le mot est bon ou pas au moment de l'exécution.

L'action lit le fichier texte et compare le contenu du mot.

%%{ 
machine test 

action startWord { 
    lastWordStart = p; 
} 
action checkSubject { 
    word = input[lastWordStart:p+1] 
    for possible in open('subjects.txt'): 
     if possible == word: 
      fgoto verb 
    # If we get here do whatever ragel does to go to an error or just raise a python exception 
    raise Exception("Invalid subject '%s'" % word) 
} 
action checkVerb { .. exercise for reader .. ;) } 
action checkAdjective { .. put adjective checking code here .. } 

subject = ws*.(alnum*)>startWord%checkSubject 
verb := : ws*.(alnum*)>startWord%checkVerb 
adjective := ws*.)alnum*)>startWord%checkAdjective 
main := subject; 
}%%