2016-07-21 4 views
-3

J'apprends le LISP commun en ce moment et j'ai rencontré un énorme barrage routier. J'ai eu une mission que nous devions apprendre à créer un analyseur dans Common LISP. J'ai réussi à tout mettre en œuvre des règles de grammaire à la lexer avec beaucoup d'aide de différentes sources en ligne. Je ne peux d'autre part sembler comprendre comment implémenter une table de symboles.Comment simuler une table de symboles en Common Lisp

C'est ce que j'ai jusqu'ici en ce qui concerne la table de symboles.

(defun symtab-add (state id) 
;; *** add symbols to symbol table *** 
) 

(defun symtab-member (state id) 
;; *** look up symbols in symbol table *** 
) 

(defun symtab-display (state) 
    (format t "------------------------------------------------------~%") 
    (format t "Symbol Table is: ~S ~%" (pstate-symtab state)) 
    (format t "------------------------------------------------------~%") 
) 

Comme vous pouvez le voir ive seulement réussi avec la partie d'affichage, si quelqu'un pouvait me lier un tutoriel ou me donner un exemple de code ou tout simplement me aider avec ce que je serais super reconnaissant.

Tout le code source pour mon affectation: http://www.cs.kau.se/cs/education/courses/dvgc01/LISP/newstart.lsp

+1

Le code est d'ici: http://www.cs.kau.se/cs/education/courses/dvgc01/LISP/newstart.lsp –

+0

"Comment simuler une table de symboles dans le LISP commun" 1) C'est " Common Lisp ", pas" Common LISP "(pas besoin de crier). 2) Comme le souligne Rainer, ce code provient d'ailleurs.Vous devez fournir l'attribution pour le code que vous publiez, et * certainement * ne devrait pas prétendre que c'est le vôtre. 3) Pourquoi "simuler" une table de symboles? Ne voudriez-vous pas en implanter un? Cette formulation suggère qu'une table de symboles n'a pas pu être implémentée dans Common Lisp, ce qui est stupide. –

+0

Oui, c'est effectivement mon devoir, je suis désolé si ce n'était pas clair. Ok donc je veux implémenter une table de symboles (l'affectation est d'analyser un simple programme pascal). Pouvez-vous me donner des indications ou me diriger dans la bonne direction? Comme vous pouvez le voir sur le lien, vous avez envoyé son code inachevé. C'est mon devoir de le finir. Tout est fait sauf pour la table des symboles. – Joo223

Répondre

-3

D'abord, vous devez créer la table des symboles, disent:

(setq my-symbol-table nil) 

Pour simplifier, nous ignorerons les paquets; vous pouvez en apprendre plus à ce sujet plus tard.

Ensuite, vous devez décider comment vous allez stocker les symboles dans la table. Encore une fois, en restant simple, vous pouvez les stocker comme une liste d'association, avec des paires de nom de symbole et de valeur de symbole. Par exemple, si vous stockez les symboles a et b avec les valeurs 3 et 5, vous auriez la table de symbole suivant:

> my-symbol-table 

> ((a . 3) (b . 5)) 

Pour utiliser cette liste d'association, vous pouvez utiliser les fonctions assoc, pousser, rplacd.

Exemple:

  • Ajouter un nouveau symbole

    (push « (c 0) mon symbole table.)

  • Rechercher un symbole:

    (assoc 'c my-symbol-table)

  • Changer la valeur d'un sy existant mbol:

    (rplacd (assoc « c mon symbole table) 18)

J'espère que cela est suffisant pour vous aller.

+2

'setq' sert à modifier les liaisons existantes. Où définissez-vous 'my-symbol-table' et où sont les' * earmuffs * '? – Sylwester

+0

Je ne vois rien dans la question d'OP qui ressemblait à des symboles devant être associés à des valeurs particulières. Cela ressemblait plus à une liste de "noms de portée" (ce qui est un peu plus logique pour lexer/parser, bien que ce soit un peu plus que le simple lexing et l'analyse syntaxique), l'analyse sémantique devrait vérifier variables étendues, etc.). –

1

Il existe plusieurs façons d'implémenter une table de symboles, avec des niveaux variables de «convenables» en fonction de vos besoins exacts. À la fin de la journée, une table de symboles est, en fait, juste une correspondance de "nom de symbole" à quelque chose.

Donc toute structure de données qui vous permet d'ajouter des choses à la fois et de regarder les choses devrait fonctionner. Les implémentations assez courantes seraient "utiliser une table de hachage" ou "utiliser une alist" (cette dernière est essentiellement une liste de paires sur le formulaire (<symbol> . <data>)).

+0

Ok donc la table de hachage est le chemin à parcourir? C'est de la nourriture parce que je trouve beaucoup sur les tables de hachage et clisp. Merci d'avoir répondu! – Joo223