{"id":26914890,"url":"https://github.com/leandrorochalg/analisador-lexico","last_synced_at":"2025-08-13T21:44:39.231Z","repository":{"id":257667433,"uuid":"858976111","full_name":"LeandroRochAlg/analisador-lexico","owner":"LeandroRochAlg","description":"[PT] Analisadores léxicos para disciplina de Compiladores.","archived":false,"fork":false,"pushed_at":"2024-09-18T19:52:04.000Z","size":20,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2024-09-19T02:16:56.521Z","etag":null,"topics":["automaton","compiler","flex","lex","lexical-analysis"],"latest_commit_sha":null,"homepage":"","language":"C","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/LeandroRochAlg.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-09-17T21:24:12.000Z","updated_at":"2024-09-18T19:53:49.000Z","dependencies_parsed_at":"2024-09-18T02:27:27.308Z","dependency_job_id":null,"html_url":"https://github.com/LeandroRochAlg/analisador-lexico","commit_stats":null,"previous_names":["leandrorochalg/analisador-lexico"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/LeandroRochAlg%2Fanalisador-lexico","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/LeandroRochAlg%2Fanalisador-lexico/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/LeandroRochAlg%2Fanalisador-lexico/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/LeandroRochAlg%2Fanalisador-lexico/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/LeandroRochAlg","download_url":"https://codeload.github.com/LeandroRochAlg/analisador-lexico/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":246685862,"owners_count":20817697,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["automaton","compiler","flex","lex","lexical-analysis"],"created_at":"2025-04-01T17:50:30.191Z","updated_at":"2025-04-01T17:50:30.886Z","avatar_url":"https://github.com/LeandroRochAlg.png","language":"C","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Analisador Léxico\n\n---\n\n## Gramática\n\nA gramática utilizada neste projeto é definida como:\n\n- Conjunto de variáveis: {C, E, P, N, A, B}\n- Conjunto de terminais: {i, e, w, x, (, ), \u003e, =, -, 3, 4, 5, 6, 7, 8}\n- Símbolo inicial: P\n  - Regras de produção:\n    - C → i ( E ) N e N\n    - C → w ( P \u003e 3 ) N x = x - 3\n    - E → N \u003e 1\n    - P → x = A | x = B\n    - N → A + B | B - A | A - B\n    - A → 3 | 4 | 5\n    - B → 6 | 7 | 8\n\n### Autômato Finito\n\n![gramatica.svg](gramatica.svg)\n\nEsse diagrama mostra as transições de estado que ocorrem conforme os caracteres da cadeia são processados.\n\n### Exemplos de Cadeias Válidas\n\nAbaixo estão dois exemplos de cadeias válidas que podem ser reconhecidas por esta gramática:\n\n1. `i(7-4\u003e1)4+6e6-3`\n2. `w(x=6\u003e3)3+6x=x-3`\n\n### Instruções de Uso\n\n1. Compile o código:\n   ```bash\n   gcc gramatica.c -o gramatica\n   ```\n\n2. Execute o programa passando a cadeia a ser validada como argumento:\n   ```bash\n   ./gramatica \"i(7-4\u003e1)4+6e6-3\"\n   ```\n\n3. O programa exibirá uma das seguintes mensagens:\n    - `Cadeia reconhecida`: se a cadeia for válida de acordo com a gramática.\n    - `Cadeia não reconhecida`: se a cadeia não for válida.\n\n### Estrutura do Código\n\nO código implementa um autômato finito que simula a análise das cadeias com base nos estados e transições definidos na gramática. Cada estado é representado em um bloco `case` dentro de um `switch`, onde as transições ocorrem conforme o caractere atual da cadeia.\n\n### Exemplo de Execução\n\nEntrada:\n```bash\n./gramatica \"i(7-4\u003e1)4+6e6-3\"\n```\n\nSaída:\n```\nCadeia reconhecida\n```\n\n### Arquivos\n\n- `gramatica.c`: código-fonte do programa.\n- `gramatica.svg`: diagrama do autômato que representa a gramática.\n\n---\n\n## Múltiplos de 6\n\nO segundo analisador léxico verifica se um número, representado em binário, é múltiplo de 6. Ele utiliza um autômato finito para identificar a validade da cadeia de bits de entrada.\n\n### Autômato Finito\n\n![multiplos.svg](multiplos.svg)\n\nEsse diagrama ilustra os estados e transições que ocorrem durante a verificação de uma cadeia de bits. O autômato é projetado para reconhecer múltiplos de 6 com base em sua representação binária.\n\n### Instruções de Uso\n\n1. Compile o código:\n   ```bash\n   gcc multiplos.c -o multiplos\n   ```\n\n2. Execute o programa passando uma cadeia binária que represente um número a ser verificado:\n   ```bash\n   ./multiplos \"1100\"\n   ```\n\n3. O programa exibirá uma das seguintes mensagens:\n    - `Cadeia reconhecida`: se a cadeia binária representar um múltiplo de 6.\n    - `Cadeia não reconhecida`: se a cadeia binária não for múltiplo de 6.\n\n### Exemplos de Cadeias Válidas\n\n- O número `12` em binário é `1100`, que é múltiplo de 6.\n- O número `42` em binário é `101010`, que também é múltiplo de 6.\n\n### Estrutura do Código\n\nO código funciona como um autômato finito onde os estados são definidos para verificar a validade de uma cadeia de bits. As transições ocorrem com base nos valores dos bits (`0` ou `1`) e seguem a lógica de identificação de múltiplos de 6.\n\n### Exemplo de Execução\n\nEntrada:\n```bash\n./multiplos \"1100\"\n```\n\nSaída:\n```\nCadeia reconhecida\n```\n\nEntrada:\n```bash\n./multiplos \"101010\"\n```\n\nSaída:\n```\nCadeia reconhecida\n```\n\n### Arquivos\n\n- `multiplos.c`: código-fonte do programa que verifica múltiplos de 6.\n- `multiplos.svg`: diagrama do autômato que representa as transições para identificar múltiplos de 6.\n\n---\n\n## Vogal-Consoante-Vogal\n\nEste analisador léxico verifica se uma cadeia de três letras segue o padrão **VCV** (vogal, consoante, vogal), utilizando um autômato finito para processar a cadeia.\n\n### Regras:\n\n- A cadeia de entrada deve ter 3 caracteres.\n- O primeiro e o terceiro caracteres devem ser vogais (a, e, i, o, u, maiúsculas ou minúsculas).\n- O segundo caractere deve ser uma consoante (qualquer letra que não seja vogal, maiúscula ou minúscula).\n\n### Autômato Finito\n\n![vcv.svg](vcv.svg)\n\nEsse diagrama mostra as transições de estado que ocorrem conforme os caracteres da cadeia são processados.\n\n### Instruções de Uso\n\n1. Compile o código:\n   ```bash\n   gcc vcv.c -o vcv\n   ```\n\n2. Execute o programa passando uma cadeia de três letras como argumento:\n   ```bash\n   ./vcv \"aba\"\n   ```\n\n3. O programa exibirá uma das seguintes mensagens:\n    - `Cadeia reconhecida`: se a cadeia seguir o formato VCV.\n    - `Cadeia não reconhecida`: se a cadeia não seguir o formato VCV.\n\n### Estrutura do Código\n\nO código define um autômato finito com 4 estados, conforme descrito abaixo:\n\n- **Estado 1**: Estado inicial, espera uma vogal.\n- **Estado 2**: Espera uma consoante.\n- **Estado 3**: Espera uma vogal.\n- **Estado 4**: Estado final (cadeia válida).\n\nCada estado é verificado dentro de um loop que percorre os caracteres da cadeia de entrada.\n\n### Exemplo de Execução\n\nEntrada:\n```bash\n./vcv \"aba\"\n```\n\nSaída:\n```\nCadeia reconhecida\n```\n\nEntrada:\n```bash\n./vcv \"abc\"\n```\n\nSaída:\n```\nCadeia não reconhecida\n```\n\n### Arquivos\n\n- `vcv.c`: código-fonte do programa que verifica cadeias no formato VCV.\n\n---\n\n## Analisador Léxico com FLEX para as Linguagens A, B e C\n\nEste projeto implementa um analisador léxico para três linguagens distintas (A, B e C) usando a ferramenta **FLEX**. O arquivo `AnaLex.flex` contém todas as regras lexicais necessárias para identificar cadeias válidas nas linguagens especificadas.\n\n### Linguagens\n\n1. **Linguagem A**: Reconhece expressões aritméticas complexas envolvendo números de 3 a 8, operadores `+` e `-`, e condições como `\u003e` e `=`.\n\n2. **Linguagem B**: Trata cadeias de números binários, que podem conter `0` e `1`, e termina sempre com `1`.\n\n3. **Linguagem C**: Processa cadeias com o padrão vogal-consoante-vogal, onde a vogal pode ser qualquer uma das letras `a, e, i, o, u` (maiúsculas ou minúsculas) e a consoante é qualquer outra letra do alfabeto.\n\n### Estrutura\n\n- **Flex Rules (Regras do FLEX)**: Cada regra da linguagem é definida no arquivo `.flex`, usando expressões regulares para identificar padrões válidos.\n- **Funções Auxiliares**:\n    - `reconhecida()`: Imprime \"Cadeia reconhecida\" quando uma cadeia é aceita.\n    - `nao_reconhecida()`: Imprime \"Cadeia não reconhecida\" quando uma cadeia é rejeitada.\n\n### Como Utilizar\n\n1. **Instale o Flex**:\n   ```bash\n   sudo apt-get install flex\n   ```\n\n2. **Compile o analisador**:\n   ```bash\n   flex AnaLex.flex\n   gcc lex.yy.c -o AnaLex -lfl\n   ```\n\n3. **Execute o analisador** com a cadeia de entrada desejada:\n   ```bash\n   ./AnaLex \"sua_cadeia_de_teste\"\n   ```\n\n    - **Exemplo 1**: Para uma cadeia válida na Linguagem A:\n      ```bash\n      ./AnaLex \"i(3+6\u003e1)\"\n      # Saída: Cadeia reconhecida\n      ```\n\n    - **Exemplo 2**: Para uma cadeia válida na Linguagem B:\n      ```bash\n      ./AnaLex \"1010\"\n      # Saída: Cadeia reconhecida\n      ```\n\n    - **Exemplo 3**: Para uma cadeia válida na Linguagem C:\n      ```bash\n      ./AnaLex \"aCa\"\n      # Saída: Cadeia reconhecida\n      ```\n\n### Arquivo `AnaLex.flex`\n\nO arquivo `AnaLex.flex` contém todas as definições de expressões regulares e a lógica de análise para as linguagens A, B e C.","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fleandrorochalg%2Fanalisador-lexico","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fleandrorochalg%2Fanalisador-lexico","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fleandrorochalg%2Fanalisador-lexico/lists"}