This shows you the differences between two versions of the page.
alf:laboratoare:03 [2021/03/26 19:34] diana.ghindaoanu [Exercices] |
alf:laboratoare:03 [2022/03/20 21:22] (current) diana.ghindaoanu [Exercices] |
||
---|---|---|---|
Line 112: | Line 112: | ||
- | ==== Exemple de création d'un lexer ==== | ||
- | |||
- | Le lexer général ressemblerait à | ||
- | |||
- | <code javascript> | ||
- | let number: RegExp = /^[0-9]+(\.?[0-9]*)/; | ||
- | let whitespace: RegExp = /^\s+/; | ||
- | let identifier: RegExp = /^[A-Za-z_][A-Za-z0-9_]*/; | ||
- | |||
- | let str: string = "the text you want to lex is this one"; | ||
- | |||
- | let error: boolean = false; | ||
- | |||
- | let tokens: string[] = []; | ||
- | |||
- | while (str.length > 0 && error === false) | ||
- | { | ||
- | // take each regular expression and try to match it | ||
- | let match: RegExpExecArray|null = []; | ||
- | // try to match the first regular expression | ||
- | // match number | ||
- | match = number.exec (str); | ||
- | if (match.length > 0) // we matched something | ||
- | { | ||
- | // delete the matched part from the string | ||
- | str = str.substring (0, match[0].length); | ||
- | // add the token | ||
- | tokens.push ({type: 'NUMBER', value: match[0]}); | ||
- | // go to the next while iteration | ||
- | continue; | ||
- | } | ||
- | // match whitespace | ||
- | match = whitespace.exec (str); | ||
- | if (match.length > 0) // we matched something | ||
- | { | ||
- | // delete the matched part from the string | ||
- | str = str.substring (0, match[0].length); | ||
- | // ignore whitespace, don;t add it to the tokens | ||
- | // go to the next while iteration | ||
- | continue; | ||
- | } | ||
- | // match idetifier | ||
- | match = identifier.exec (str); | ||
- | if (match.length > 0) // we matched something | ||
- | { | ||
- | // delete the matched part from the string | ||
- | str = str.substring (0, match[0].length); | ||
- | // add the token | ||
- | tokens.push ({type: 'IDENTIFIER', value: match[0]}); | ||
- | // go to the next while iteration | ||
- | continue; | ||
- | } | ||
- | } | ||
- | |||
- | console.log (tokens); | ||
- | |||
- | </code> | ||
- | |||
- | Comme vous pouvez le voir, le code est assez long pour seulement trois expressions régulières. Les langages de programmation ont un contenu plus complexe, alors c'est pourquoi nous voulons utiliser un générateur de lexer, dans ce cas celui inclus en **ANTLR 4**. | ||
==== Lexer en ANTLR4 ==== | ==== Lexer en ANTLR4 ==== | ||
Line 234: | Line 175: | ||
- Parcourez et affichez la liste des tokens (pour chaque token, affichez son nom et sa valeur comme dans l'exemple. **Indice**: Pour pouvoir afficher la liste des tokens, vous devrez inspecter la classe //BufferedTokenStream// et choisir une méthode qui retourne cette liste. Vous aurez aussi besoin de la fonction **nextToken()** pour parcourir le buffer de données. **(0.5)** <code bash>[{ '10': 'INT', '\n': 'NEWLINE', '20': 'INT' }</code> | - Parcourez et affichez la liste des tokens (pour chaque token, affichez son nom et sa valeur comme dans l'exemple. **Indice**: Pour pouvoir afficher la liste des tokens, vous devrez inspecter la classe //BufferedTokenStream// et choisir une méthode qui retourne cette liste. Vous aurez aussi besoin de la fonction **nextToken()** pour parcourir le buffer de données. **(0.5)** <code bash>[{ '10': 'INT', '\n': 'NEWLINE', '20': 'INT' }</code> | ||
- Ajoutez a votre fichier ''Alf.g4'' des expressions régulières pour les jetons suivants: WORD - tout texte contenant uniquement des lettres et PONCTUATION - différents signes de ponctuation. Utilisez le lexer créé dans l'exercice précédent pour afficher la liste des tokens pour le texte: //Bonjour! Le TP d'ALF est de 8 a 10.// **(1p)** | - Ajoutez a votre fichier ''Alf.g4'' des expressions régulières pour les jetons suivants: WORD - tout texte contenant uniquement des lettres et PONCTUATION - différents signes de ponctuation. Utilisez le lexer créé dans l'exercice précédent pour afficher la liste des tokens pour le texte: //Bonjour! Le TP d'ALF est de 8 a 10.// **(1p)** | ||
- | - Utilisez votre lexer pour analyser les jetons du fichier [[https://github.com/alexandruradovici/alf2018/blob/master/TP/TP4/text_and_numbers.txt|text_and_numbers.txt]]. Pour chaque ligne de ce fichier affichez le texte du jeton, le type, et la ligne du fichier ou il a été trouvé. **(1p)** | + | - Utilisez votre lexer pour analyser les jetons du fichier [[https://github.com/UPB-FILS-ALF/TP/blob/main/TP3/text_and_numbers.txt|text_and_numbers.txt]]. Pour chaque ligne de ce fichier affichez le texte du jeton, le type, et la ligne du fichier ou il a été trouvé. **(1p)** |
- Ecrivez un lexer qui reconnaît un sous-ensemble du langage Python. Pour chaque point de cet exercice, utilisez comme exemple une chaîne quelconque correspondant au langage Python, pour voir si votre programme peut: **(3p)** | - Ecrivez un lexer qui reconnaît un sous-ensemble du langage Python. Pour chaque point de cet exercice, utilisez comme exemple une chaîne quelconque correspondant au langage Python, pour voir si votre programme peut: **(3p)** | ||
- Reconnaître les mots-clés suivants: for, if, while, else, def, break, class | - Reconnaître les mots-clés suivants: for, if, while, else, def, break, class | ||
Line 245: | Line 186: | ||
- **Bonus**: Modifiez le lexer de l'exercice **7** pour qu'il reconnaisse aussi des chaînes de caractères (texte encapsulé entre ” ou '). **(1p)** | - **Bonus**: Modifiez le lexer de l'exercice **7** pour qu'il reconnaisse aussi des chaînes de caractères (texte encapsulé entre ” ou '). **(1p)** | ||
- | |||
- | [[https://github.com/UPB-FILS-ALF/TP/tree/main/TP3|Solutions]] | ||