DanielSRS / Compiladores

Um analizador léxico para uma pseudo linguagem de programação escrito em python.
0 stars 0 forks source link

Atualização da gramaica #4

Open DanielSRS opened 1 year ago

DanielSRS commented 1 year ago
! Identificador
IDE  = {Letter}({Letter} | {Alphanumeric} | '_')*
NRO = '-'? {Whitespace}* {Digit}+ ('.' {Digit} ({Digit})*)?
{Simbolo} = {#32 .. #126} - {#34}
CAC = '"'({Letter} | {Digit} | {Simbolo} | [ ])* '"'

"Start Symbol" = <EstruturaDoPrograma>
<EstruturaDoPrograma> ::= <OpcionaisConstantes> <OpcionalStruct> <OpcionaislVariaveisGlobais><AreaDeFuncoesEProcedimentos>

! Valor booleano          
<Boolean> ::= 'true' | 'false'

! Definição da quantidade de Dimensoes de acesso a uma variavel de forma opcional
<OpcionalDimensoesDeAcesso> ::= <DimensoesDeAcesso> | 

! Definição da quantidade de Dimensoes de acesso de uma matriz
<DimensoesDeAcesso> ::= <TamanhoDaDimensao> <DimensaoOpcional>
<TamanhoDaDimensao> ::= '[' <IndiceDeAcesso> ']'
<DimensaoOpcional> ::= <TamanhoDaDimensao> <DimensaoOpcional> |           
<IndiceDeAcesso> ::= NRO | IDE |

! Declaração opcional de uma estrutura
<OpcionalStruct> ::= <DeclaracaoStruct> <OpcionalStruct> |

! Declaração de um tipo composto
<DeclaracaoStruct> ::= 'struct' IDE <CorpoDaEstrutura>
! Corpo de uma estrutura ou especialização de uma estrutura
<CorpoDaEstrutura> ::= '{' <VariaveisDaStruct> '}' | <EspecializacaoDeStruct>                 
! Extends de uma struct
<EspecializacaoDeStruct> ::= 'extends' IDE '{' <VariaveisDaStruct> '}'

! Variaveis do corpo de uma struct
<VariaveisDaStruct> ::= <DeclaracaoDeVariavelDeStruct> <OpcionaisVariaveisDaStruct>
<OpcionaisVariaveisDaStruct> ::= <VariaveisDaStruct> |

! Declaração de variavel dentro de estrutura
<DeclaracaoDeVariavelDeStruct> ::= <Tipo> <ListaDeVariaveisStruct> ';'
! Identificaçao da variavel e atribuicaço de valor
<ListaDeVariaveisStruct> ::= IDE <OpcionalDimensoesDeAcesso> <AtribuicaoMultiplaStruct>
! listagem e atribuição de outras variaveis
<AtribuicaoMultiplaStruct> ::= <AtribuicaoDeVariavelStruc> <OutrasAtribuicoesOpcionais>
! multiplas declarações opcionais
<OutrasAtribuicoesOpcionais> ::= ',' <ListaDeVariaveisStruct> |
! Valor opcional de atribuiçao
<AtribuicaoDeVariavelStruc> ::= '=' <ValorDeStribuicaoStruct> |
<ValorDeStribuicaoStruct> ::= IDE <Valor_Comecando_Com_IDE>  | NRO  | CAC | <Boolean> | '(' <ExpressaoAritmetica> ')'

<Valor_Comecando_Com_IDE> ::= <ConteudoDoPrintIDE>

! <PossivelExpressaoAritimetica> ::= <MultiplicacaoOuDivisao> <ExpressaoComSomaSub> |

! Declaração opcional de variáveis globais
<OpcionaislVariaveisGlobais> ::= <VariaveisGlobais> |
! Bloco de variaveis globais        
<VariaveisGlobais> ::= 'var' '{' <DeclaracaoDentroDoBlocoDeVar> '}'
<DeclaracaoDentroDoBlocoDeVar> ::= <VariaveisDaStruct>

! Declaração do opcionais de constantes
<OpcionaisConstantes> ::= <Constantes> |
! Bloco de constantes
<Constantes> ::= 'const' '{' <DeclaracaoDentroDoBlocoDeConst> '}'
<DeclaracaoDentroDoBlocoDeConst> ::= <VariaveisDaStruct>

! Area para declaração de funões ou procedimentos     
<AreaDeFuncoesEProcedimentos> ::= <FuncaoOuProcedimento> <AreaDeFuncoesEProcedimentos> | <FuncaoOuProcedimento>
<FuncaoOuProcedimento> ::= <Funcao> | <Procedimento>

! Bloco
<BlocoDeCodigo> ::= '{' <Conteudos> '}'
<Conteudos> ::= <ConteudoDeBloco> <Conteudos>  |
<ConteudoDeBloco> ::= <While> | <If> | <Print> | <Read> | <VariaveisGlobais> | IDE <VariacoesComIDEnoBloco>

! Chamada de função ou procedimento
! atribuiçõo de valor em uma variavel
! atribuição de valor em matriz
<VariacoesComIDEnoBloco> ::= '(' <OpcionaisArgumentos> ')' ';' | '=' <ValorDeStribuicaoStruct> ';' | <DimensaoDaMatriz> '=' <ValorDeStribuicaoStruct> ';'
! <AtribuicaoDeValorNoBloco> ::= 

! While
<While> ::= 'while' '(' ')' <BlocoDeCodigo>

! If
<If> ::= 'if' '(' ')' 'then' <ConteudoDoIf>
<ConteudoDoIf> ::= <BlocoDeCodigo> <OpcionalElse>
<OpcionalElse> ::= 'else' <BlocoDeCodigo> |

! Elemento de matriz
! <ElementoDaMatriz> ::= IDE <DimensaoDaMatriz>
<DimensaoDaMatriz> ::= <IndiceDeAcessoDaMatriz> <OpcionalIndice>
<IndiceDeAcessoDaMatriz> ::= '[' <ValorDoIndice> ']'
<OpcionalIndice> ::= <IndiceDeAcessoDaMatriz> <OpcionalIndice> |           
<ValorDoIndice> ::= NRO | IDE

! Print
<Print> ::= 'print' '(' <ConteudoDoPrint> ')' ';'
<ConteudoDoPrint> ::= IDE <ConteudoDoPrintIDE> | CAC  
<ConteudoDoPrintIDE> ::= '.' IDE | <DimensaoDaMatriz> |

! Read
<Read> ::= 'read' '(' <Ler> ')' ';'
<Ler> ::= IDE <ConteudoDoPrintIDE>

! Chamada funcção
! <RetornoFuncao> ::= IDE '(' <OpcionaisArgumentos> ')'
<OpcionaisArgumentos> ::= <ListaDeArgumentos> |
<ListaDeArgumentos> ::= <Argumento> <OutrosArgumentos>
<OutrosArgumentos> ::= ',' <ListaDeArgumentos> |
<Argumento> ::= <ValorDeStribuicaoStruct>

! Ou também chamada de procedimento
! <ChamadaFuncao> ::= <RetornoFuncao> ';'

! Expressao Aritmetica
<ExpressaoAritmetica> ::= <ValorOuMultiDiv> <ExpressaoComSomaSub>
<ValorOuMultiDiv>   ::= <Valor> <MultiplicacaoOuDivisao>
<MultiplicacaoOuDivisao> ::= '*' <ValorOuMultiDiv> | '/' <ValorOuMultiDiv> |
<ExpressaoComSomaSub> ::= <SimboloSomaSub> <ExpressaoAritmetica> |
<Valor> ::= <Operavel> | '(' <ExpressaoAritmetica> ')'
<SimboloSomaSub> ::= '+' | '-'
<Operavel> ::= IDE | NRO

! Declaração de uma função                        
<Funcao> ::= 'function' <Tipo> IDE '(' <ListParametros> ')' '{' '}'
! Lista de parametros pode ser vazia
<ListParametros> ::= <Parametro> <OutroParametro> |
! Se mais de um parametro
<OutroParametro> ::= ',' <ListParametros> |
! Definição do parametro
<Parametro> ::= <Tipo> IDE

! Tipo
<Tipo> ::= 'int' | 'real' | 'boolean' | 'string' | IDE
! Declaração de um procedimento
<Procedimento> ::= 'procedure' IDE '(' ')' <BlocoDeCodigo>
DanielSRS commented 1 year ago

Utilizando outro BNF parser

/* Identificador */
<letter>         ::= "A" | "B" | "C" | "D" | "E" | "F" | "G" | "H" | "I" | "J" | "K" | "L" | "M" | "N" | "O" | "P" | "Q" | "R" | "S" | "T" | "U" | "V" | "W" | "X" | "Y" | "Z" | "a" | "b" | "c" | "d" | "e" | "f" | "g" | "h" | "i" | "j" | "k" | "l" | "m" | "n" | "o" | "p" | "q" | "r" | "s" | "t" | "u" | "v" | "w" | "x" | "y" | "z"
<digit>          ::= "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9"
<opt_whitespace> ::= " "*
<IDE>  ::= <letter> (<letter> | <digit> | "_")*
<NRO> ::= "-"? <opt_whitespace> <digit>+ ("." <digit> (<digit>)*)?
<CAC> ::= "\"" (<letter> | <digit>)* "\""

<EstruturaDoPrograma> ::= <OpcionaisConstantes> <OpcionalStruct> <OpcionaislVariaveisGlobais> <AreaDeFuncoesEProcedimentos>

/** Valor booleano */          
<Boolean> ::= "true" | "false"

/* Definição da quantidade de Dimensoes de acesso a uma variavel de forma opcional  */
<OpcionalDimensoesDeAcesso> ::= <DimensoesDeAcesso> | E

/* Definição da quantidade de Dimensoes de acesso de uma matriz */
<DimensoesDeAcesso> ::= <TamanhoDaDimensao> <DimensaoOpcional>
<TamanhoDaDimensao> ::= "[" <IndiceDeAcesso> "]"
<DimensaoOpcional> ::= <TamanhoDaDimensao> <DimensaoOpcional> | E        
<IndiceDeAcesso> ::= <NRO> | <IDE> | E

/* Declaração opcional de uma estrutura */
<OpcionalStruct> ::= <DeclaracaoStruct> <OpcionalStruct> | E

/* Declaração de um tipo composto */ 
<DeclaracaoStruct> ::= "struct" <IDE> <CorpoDaEstrutura>
/* Corpo de uma estrutura ou especialização de uma estrutura */
<CorpoDaEstrutura> ::= "{" <VariaveisDaStruct> "}" | <EspecializacaoDeStruct>                 
/* Extends de uma struct */
<EspecializacaoDeStruct> ::= "extends" <IDE> "{" <VariaveisDaStruct> "}"

/* Variaveis do corpo de uma struct */
<VariaveisDaStruct> ::= <DeclaracaoDeVariavelDeStruct> <OpcionaisVariaveisDaStruct>
<OpcionaisVariaveisDaStruct> ::= <VariaveisDaStruct> | E

/* Declaração de variavel dentro de estrutura */
<DeclaracaoDeVariavelDeStruct> ::= <Tipo> <ListaDeVariaveisStruct> ";"
/* Identificaçao da variavel e atribuicaço de valor */
<ListaDeVariaveisStruct> ::= <IDE> <OpcionalDimensoesDeAcesso> <AtribuicaoMultiplaStruct>
/* listagem e atribuição de outras variaveis */
<AtribuicaoMultiplaStruct> ::= <AtribuicaoDeVariavelStruc> <OutrasAtribuicoesOpcionais>
/* multiplas declarações opcionais */
<OutrasAtribuicoesOpcionais> ::= "," <ListaDeVariaveisStruct> | E
/* Valor opcional de atribuiçao */
<AtribuicaoDeVariavelStruc> ::= "=" <ValorDeStribuicaoStruct> | E
<ValorDeStribuicaoStruct> ::= <IDE> <PossivelExpressaoAritimetica> | <NRO> <PossivelExpressaoAritimetica> | <CAC> | <Boolean> | "(" <ExpressaoAritmetica> ")"

<PossivelExpressaoAritimetica> ::= <MultiplicacaoOuDivisao> <ExpressaoComSomaSub> | E

/* Declaração opcional de variáveis globais */
<OpcionaislVariaveisGlobais> ::= <VariaveisGlobais> | E
/* Bloco de variaveis globais */        
<VariaveisGlobais> ::= "var" "{" <DeclaracaoDentroDoBlocoDeVar> "}"
<DeclaracaoDentroDoBlocoDeVar> ::= <VariaveisDaStruct>

/* Declaração do opcionais de constantes */
<OpcionaisConstantes> ::= <Constantes> | E
/* Bloco de constantes */
<Constantes> ::= "const" "{" <DeclaracaoDentroDoBlocoDeConst> "}"
<DeclaracaoDentroDoBlocoDeConst> ::= <VariaveisDaStruct>

/* Area para declaração de funões ou procedimentos     */
<AreaDeFuncoesEProcedimentos> ::= <FuncaoOuProcedimento> <AreaDeFuncoesEProcedimentos> | <FuncaoOuProcedimento>
<FuncaoOuProcedimento> ::= <Funcao> | <Procedimento>

/*  Bloco */
<BlocoDeCodigo> ::= "{" <Conteudos> "}"
<Conteudos> ::= <ConteudoDeBloco> <Conteudos>  | E
<ConteudoDeBloco> ::= "fg"

/*  Expressao Aritmetica */
<ExpressaoAritmetica> ::= <ValorOuMultiDiv> <ExpressaoComSomaSub>
<ValorOuMultiDiv> ::= <Valor> <MultiplicacaoOuDivisao>
<MultiplicacaoOuDivisao> ::= "*" <ValorOuMultiDiv> | "/" <ValorOuMultiDiv> | E
<ExpressaoComSomaSub> ::= <SimboloSomaSub> <ExpressaoAritmetica> | E
<Valor> ::= <Operavel> | "(" <ExpressaoAritmetica> ")"
<SimboloSomaSub> ::= "+" | "-"
<Operavel> ::= <IDE> | <NRO>

/* Declaração de uma função  */                       
<Funcao> ::= "function" <Tipo> <IDE> "(" <ListParametros> ")" "{" "}"
/* Lista de parametros pode ser vazia */
<ListParametros> ::= <Parametro> <OutroParametro> | E
/* Se mais de um parametro */
<OutroParametro> ::= "," <ListParametros> | E
/* Definição do parametro */
<Parametro> ::= <Tipo> <IDE>

/* Tipo */
<Tipo> ::= "int" | "real" | "boolean" | "string" | <IDE>
/* Declaração de um procedimento */
<Procedimento> ::= "procedure" <IDE> "(" ")" <BlocoDeCodigo>