Open DanielSRS opened 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>