2010-06-23 14 views
0

Je suis en train d'apprendre l'analyse lexicale dans la conception de compilateurs. Afin d'apprendre comment fonctionne vraiment un analyseur lexical, j'essaie d'en construire un moi-même. Je prévois de le construire en Java.Construction d'un analyseur lexical en Java

L'entrée de l'analyseur lexical est un fichier .tex de format suivant.

\begin{document} 

    \chapter{Introduction} 

    \section{Scope} 

    Arbitrary text. 

    \section{Relevance} 

    Arbitrary text. 

    \subsection{Advantages} 

    Arbitrary text. 

    \subsubsection{In Real life} 

    \subsection{Disadvantages} 

    \end{document} 

La sortie du lexer doit être une table des matières éventuellement avec des numéros de page dans un autre fichier.

1. Introduction 1 
    1.1 Scope   1 
    1.2 Relevance  2 
    1.2.1 Advantages 2 
     1.2.1.1 In Real Life 2 
    1.2.2 Disadvantages 3 

J'espère que ce problème est dans le cadre de l'analyse lexicale. Ma lexer lirait le fichier .tex et verifierait '\' et trouverait continue la lecture pour verifier si c'est bien l'une des commandes de sectionnement. Une variable d'indicateur est définie pour indiquer le type de sectionnement. Le mot entre accolades suivant la commande de coupe est lu et écrit avec le préfixe précédé d'un nombre (comme 1.2.1) en fonction du type et de la profondeur.

J'espère que l'approche ci-dessus fonctionnerait pour construire le lexer. Comment faire pour ajouter des numéros de page à la table des matières si cela est possible dans le cadre de la lexer?

+0

Cela ne devrait-il pas être «1.2.1.1 dans la vraie vie» au lieu de «1.2.1 dans la vraie vie»? –

+0

Merci. J'ai fait la correction. – primpap

Répondre

2

Vous pouvez vraiment les ajouter comme vous le souhaitez. Je vous recommande de stocker le contenu de votre fichier .tex dans votre propre structure en forme d'arbre ou de carte, puis de lire votre fichier de numéros de pages et de les appliquer de manière appropriée.

Une option plus archaïque serait d'écrire un second analyseur qui analyse la sortie de votre premier analyseur et le fichier de numéros de ligne et les ajoute de manière appropriée.

C'est vraiment à vous de choisir. Puisque c'est un exercice d'apprentissage, essayez de construire comme si quelqu'un d'autre devait l'utiliser. Comment est-ce convivial? Faire quelque chose que vous seul pouvez utiliser est encore bon pour l'apprentissage conceptuel, mais pourrait conduire à des pratiques désordonnées si vous l'utilisez jamais dans le monde réel!

+0

Je n'ai pas tout à fait compris votre premier point de stockage du contenu dans une structure arborescente. Pourriez-vous élaborer à ce sujet? Je souhaite faire l'ensemble du processus de construction de la table des matières dans le cadre de l'analyse lexicale et ne pas utiliser un analyseur. Je pense implémenter une approche moins conviviale dans laquelle l'utilisateur doit insérer '\ pagebreak' à la fin de chaque page. – primpap

+1

La syntaxe de '\ pagebreak' n'est pas du tout amicale - cela me semble assez raisonnable. En outre, dans ce cas, il y a peu de différence entre votre lexeur et votre analyseur. Votre lexer génère simplement des jetons - pour faire quelque chose avec ces jetons, vous avez besoin d'un analyseur. Si vous les combinez en une seule entité, c'est bien, même si cela peut vous limiter sur la route. En ce qui concerne le stockage, considérons un scénario avec un objet TOCEntry avec 'String loc; String desc; int pagenum; 'Vous créez un arbre ou une carte de TOCEntry par exemple' entries.add (new TOCEntry ("1.2", "Relavence")); '(commentaire suite au suivant) – corsiKa

+0

où, évidemment," 1.2 "et" relavence " "sont générés à partir de votre entrée et non codés en dur ... Puis une fois que vous avez lu le fichier des numéros de page, si vous aviez" 1.2 "page 2, vous pouviez alors (si vous utilisiez une carte avec loc. ("1.2").setPageNum (2); 'Évidemment, ce sont des exemples construits, codés en dur, dont les entrées seraient dynamiques en lisant dans le fichier. – corsiKa

0

Ce que vous décrivez est en fait un analyseur lexer plus. Le travail de l'analyseur lexical ici est de retourner les jetons et d'ignorer les espaces. Les jetons sont les différents mots-clés introduits par '\', les littéraux de chaînes à l'intérieur de '{', '}' et le texte arbitraire ailleurs. Tout le reste que vous avez décrit est l'analyse et la construction d'arbres.