Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Atualização da gramaica #4

Open
DanielSRS opened this issue Nov 28, 2022 · 1 comment
Open

Atualização da gramaica #4

DanielSRS opened this issue Nov 28, 2022 · 1 comment
Labels
enhancement New feature or request

Comments

@DanielSRS
Copy link
Owner

DanielSRS commented Nov 28, 2022

  • Corrige fatoração a esquerda
  • reordena os elementos
! 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 DanielSRS added the enhancement New feature or request label Nov 28, 2022
@DanielSRS
Copy link
Owner Author

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>

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request
Projects
None yet
Development

No branches or pull requests

1 participant