Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Felipe Bruno

Analisador Lexico e Analisador Sintãtico em C

Recommended Posts

Olá, como trabalho de uma cadeira da faculdade tenho que fazer um analisador lexico e sintático em c (Um Scanner e um Parser para um Subconjunto da Linguagem PORTUGOL).

 

Gostaria de deixar claro que estou aqui solicitando a ajuda de vocês e não para que façam ele por mim. Ficarei muito grato se puderem colaborar.

 

Gostaria da ajuda de vocês para implementar esse código em C, estou meio perdido então não sei por onde começar a implementar. Sei que devo começar a implementar primeiro o Analisador Lexico, analisando o algorítimo (portugol) caracter por caracter e depois se a palavra lida no final for correta, ele irá fazer a atribuição.

 

Ex: 
array= {'i','n','i','c','i','o',' ','i'...};

Logo id_inicio = array[1] a array[5];

 

bem complicado... aguardo ajuda :thumbsup:

 

Objetivos:

* Construir uma gramática para um trecho bem determinado de uma linguagem de

programação.

* Construir e implementar uma máquina de Moore a partir de um AFD para simular um

scanner (analisador léxico) do caso proposto.

* Aplicar a técnica da conversão de gramáticas em algoritmos e desta forma criar um

parser (analisador sintático) e um scanner (analisador léxico) para o trecho proposto.

* Melhorar a compreensão dos elementos da Hierarquia de Chomsky e suas relações,

bem como a sua aplicabilidade na construção de partes de um compilador.

 

Descrição do trabalho:

Um software para executar um analisador léxico e sintático desenvolvido em ling. C

1. Comando PARA;

2. Comando SE;

3. Comando LER;

4. Comando ESCREVER;

5. Atribuição "<-";

6. Inicio e Fim.

 

Obs.:

* As expressões condicionais devem ser formadas apenas por um operador relacional:

maior, maior ou igual, menor e menor ou igual, ou seja, não existe OU / E. Os elementos

comparados só podem ser expressões aritméticas.

**Não existem operadores lógicos.

* As expressões aritméticas devem ser formadas apenas por variáveis, números,

parênteses balanceados e as operações de soma e subtração.

* O comando de atribuição só deve trabalhar com expressões aritméticas. NÃO É

possível ter atribuições múltiplas, tal como: b <- a <- 5;

* Não deve ser considerado o tipo string.

* O comando Escrever só deve trabalhar com variáveis.

* Não devem existir palavras reservadas para a formação dos nomes de variáveis. Por

exemplo, inteiro deve ser aceito como variável apesar de ser reservado.

* Os únicos comandos aceitos como corpo de programa são os 8 enumerados acima.

Detalhes necessários da implementação

* O analisador léxico deve ser implementado através da técnica da análise preditiva feita

a partir da Gramática Regular/Máquina de Moore.

* Identificação, do número da linha, do número da coluna e do lexema que provocou o

erro sintático.

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

Então... já tinha visto esse post. Tentei analisar ele, mas tive dificuldade, já que não conheço php. Vou ler calmamente para ver se consigo entender algo. Ainda estou no inicio da faculdade. E obrigado pela ajuda. Toda ajuda é bem vinda. Grato.

Compartilhar este post


Link para o post
Compartilhar em outros sites

O primeiro passo é definir a gramática. Qual sua gramática?

 

Bem, não sei se está correto. Me corrijam por favor.

 

<número> ::= <número> <dígito>
<número> ::= <dígito>
<dígito> ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
<alfabeto> ::= a | b | c | d | e | f | g | h | i | j | k | l | m | n | o | p | q | r | s | t | u | v | w | y | x | z

os tokens que serão reconhecidos:

inicio  <id_inicio> ::= i, n , i , c, i , o
para <id_para> ::= p, a, r, a
se <id_se> ::= s, e
ler <id_ler> ::= l, e, r
escrever <id_escrever> ::= e, s, c, r, e, v, e, r
fim <id_fim> ::= f, i, m

operadores:

<-; <id_op> ::= <, -

 

Lendo sobre o mesmo, vi que na tabela do analisador lexico cada cadeia tem seu codigo. Esse codigo pode ser qualquer um? eu que faço a atribuição dele? Ex: Simbolo IDENT o codigo é 1 e op o codigo é 11.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não conheço e nem entendi esta notação. Sugiro que use a BNF. Qual a produção inicial?

 

Bem como está no artigo do wiki, aqui está:

 

o "id_" no caso abaixo, são os tokens.

 

<inicio_e_fim> ::= <id_inicio> /* Duvida aqui, pois aqui posso ter um "se", "para", "ler" e "escrever" em ordenação aleatoria como também não posso ter os mesmos no algoritomo. Então como fazer aqui? */ <id_fim>
<se> ::= <id_se> "(" <id_cond> <id_op> <id_cond> ")" <id_fim_se>
<escrever> ::= <id_escrever> "(" <id_var> ")"
<para> ::= <id_para> <id_var> <id_de> <id_var> <id_ate> <id_num> <id_fim_para>
<ler> ::= <id_ler> "(" ")"

 

Me desculpe, mas não entendi quanto a

Qual a produção inicial?

Grato. :)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não. Trechos marcados <assim> denotam produções gramaticais. A produção inicial é aquela através da qual todos os programas da linguagem (ou, equivalentemente, cadeias da gramática) são criados. Você precisa definir a produção inicial. Sua notação atual não é a BNF. Leia o artigo com atenção para aprender a usá-la. Você tem símbolos não-terminais à esquerda das regras de produção, e não sei o que quis dizer com sua notação para os lados direitos (exemplo: p, a, r, a).

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bem, com certa duvida. Resolvi procurar o professor para tirar duvida sobre. Então, ele me falou que não (é)estamos usando BNF, mas sim com maquina de moore. Acredito eu que devo implimentar a gramatica junto com o Analisador Lexico.

Compartilhar este post


Link para o post
Compartilhar em outros sites

A BNF é uma notação para produções gramaticais. A máquina de Moore é o que você usará para processar as cadeias. Você precisa definir a gramática. Especifique seu alfabeto, suas produções e sua produção inicial.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Posso. Segue o exemplo que define um número real:

 

<real>         ::= <sinal> <digito> <mais-digitos> "." <digito> <mais-digitos>
<sinal>        ::= ""  | "+" | "-"
<digito>       ::= "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9"
<mais-digitos> ::= <digito> <mais-digitos> | ""

 

Para as produções acima, que definem números como 2.4, -3.95823, 125918.2385, +0.0, etc, o alfabeto é { +, -, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, .} e a produção inicial é <real>.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Desculpe a demora para resposta, por motivos maiores não pude responder antes.

 


<algoritimo>    ::= <inicio> | <variavel> | <se> | <para> | <atribuicao> | <ler> | <escrever>  | <fim>
<variavel>      ::= <sinal> <alfabeto> | <mais_alfabeto> | <digito> | <mais_digito>
<sinal>         ::= ""  | "=" 
<alfabeto>      ::= "a" | "b" | "c" | "d" | "e" | "f" | "g" | "h" | "i" | "j" | "k" | "l" | "m" | "n" | "o" | "p" | "q" | "r" | "s" | "t" | "u" | "v" | "w" | "y" | "x" | "z" 
<digito>        ::= "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" 
<mais_alfabeto> ::= <alfabeto> <mais_alfabeto> | " "
<mais_digitos>  ::= <digito> <mais_digitos> | " "
<ate>           ::= "a" "t" "e"
<faca>          ::= "f" "a" "c" "a"
<se>            ::= "s" "e"
<fim_se>        ::= "e" "n" "t" "a" "o"
<para>          ::= "p" "a" "r" "a" 
<ler>           ::= "l" "e" "r"
<escrever>      ::= "e" "s" "c" "r" "e" "v" "e" "r"
<atribuicao>    ::= "<" "-"
<inicio>        ::= "i" "n" "i" "c" "i" "o"
<fim>           ::= "f" "i" "m"
<parentese>     ::= "(" | ")"

 

Nesses deve-se colocar a ordem como a seguir? ou deixar como acima?

<se>            ::= "s" "e" <parentese> <variavel> <sinal> <variavel> <paretese>
<fim_se>        ::= "e" "n" "t" "a" "o" <variavel> | <sinal> | <atribuicao>
<para>          ::= "p" "a" "r" "a" <variavel> <ate> <variavel> <faca>
<ler>           ::= "l" "e" "r" <parentese> <variavel> <parentese>

 

 

Para as produções acima, que definem números como naturais , o alfabeto é { +, -, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e, f, g, h, i, j , k , l , m , n , o , p , q , r , s, t, u, v, w, y, x , z} e a produção inicial é <algoritimo>.

 

Grato.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Essa gramática torna legais os seguintes programas:

 

=a

 

se

 

inicio

 

É isto mesmo que queria?

 

As produções do segundo código não são equivalentes às do primeiro.

 

E a do para, escrever e ler? Tinha ficado em duvida em <algoritimo> na hora de fazer a gramatica, pois certamente terá o <inicio> no começo e <fim> no final, mas os outros poderiam ser aleatórios, então coloquei |.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.