-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathGramática.grm
138 lines (119 loc) · 8.5 KB
/
Gramática.grm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
! Welcome to GOLD Parser Builder 5.2
"Name" = 'Gramatica'
"Author" = 'PBL'
"Version" = '1.0'
"About" = 'Mi-Compiladores'
"Start Symbol" = <Inicio>
"Case Sensitive" = 'True'
! Elementos Terminais
Identificador = {Letter}({AlphaNumeric} | '_')* | {CabecaDoIdentificador}{CaudaDoIdentificador}*
!Numero = ( '-' )? {Number}+ ('.'{Number}+ )?
Numero = {Number}+('.'{Number}+)?
Boolean = 'true' | 'false'
CadeiaDeCaracteres = '"' ({StringSimbolos} | '\' {Printable})* '"'
!Não Terminais
{CabecaDoIdentificador} = {Letter}
{CaudaDoIdentificador} = {Alphanumeric} + [_]
{StringSimbolos}= {Printable}-["\]
<numero> ::= Numero | '-'Numero |
<valor> ::= Numero | CadeiaDeCaracteres | Boolean
<valorSemNum> ::= CadeiaDeCaracteres | Boolean
<elemento> ::= Numero | <id> | ! vazio
<elementotop> ::= CadeiaDeCaracteres | <elemento> | <MetodoComoParametro>
!<tipo> ::= identificador
<id> ::= identificador <vetor> | identificador ! um identificador pode ser um vetor, exemplo int ou int[1]
<vazio> ::= ! jeito que encontrei de fazer o comando vazio
<vetor> ::= '[' <elemento> ']' | '[' <elemento> ']' <vetor>
<iniciarVetor> ::= '{' <iniciarVetor2> '}' ! cria as chaves externas da inicialização do vetor
<iniciarVetor2> ::= '(' <iniciarVetor3> ')' | '(' <iniciarVetor3> ')' <iniciarVetor2> ! cria os parenteses internos da inicialização do vetor
<iniciarVetor3> ::= <elementotop> | <elementotop> ',' <iniciarVetor3> ! preenche cada grupo de parenteses com numeros ex: (1,2,3)
!Definições Básicas
<Inicio> ::= <blococonst> <Classe> | <Classe>
<tipo> ::= 'float' | 'int'| 'string' | 'bool'
!<TipoRetorno> ::= 'float' | 'int'| 'string' | 'bool' | 'void'
<OperadorLogico> ::= '!' | '&&' | '||'
<OperLogicoConcat> ::= '&&' | '||'
<OperadorRelacional> ::= '!=' | '==' | '<' | '<=' | '>' | '>=' | '='
!Classe
<Classe> ::= 'class' <NomeClasse> '{' <Codigo> '}' <Classe> | 'class' <NomeClasse> 'extends' <NomeClasse> '{' <Codigo> '}' <Classe> |
<Codigo> ::= <blocovar> <Codigo> | <Metodo> <Codigo> | <Atribuicao> <Codigo>| <If> <Codigo> | <While> <Codigo> | <Read> <Codigo> | <Write> <Codigo> |
<NomeClasse> ::= Identificador
<Acesso a atributo> ::= Identificador'.'Identificador
!Constantes
<blococonst> ::= const '{' <inicializarConst> '}'
<inicializarConst> ::= <tipo> <inicializarVar> ';' <inicializarConst> | <vazio>
<inicializarVar> ::=<id> '=' <valorInicialConst> | <id> '=' <valorInicialConst> ',' <inicializarVar>
<valorInicialConst> ::= <Expr Arit> | <iniciarVetor> | <valorSemNum> ! Valor inicial para constantes, pois não podem receber valores de uma chamada de método.
!Variaveis
<blocovar> ::= variables '{' <declararInicializarVar> '}'
<declararInicializarVar> ::= <tipo> <declararInicializar> ';' <declararInicializarVar>
| <Acesso a atributo>'='<valorInicial>';'<declararInicializarVar> | <vazio>
<declararInicializar> ::= <id> | <id> ',' <declararInicializar> | <id> '=' <valorInicial> | <id> '=' <valorInicial> ',' <declararInicializar>
<valorInicial> ::= <Expr Arit> | <iniciarVetor> | <valorSemNum>
| <MetodoComoParametro> | <Acesso a atributo> ! um valor pode ser uma string, um boolean, um inteiro por exemplo, ou um conjunto de numeros
!Atributos ! essa parte aqui não precisa utilizar... usa só o bloco variaveis de cima...
<Atributos> ::= 'variables' '{' <MultAtributos> '}'
<MultAtributos> ::= <Tipos> <DeclaracaoAtributos> ';' <MultAtributos> |
<DeclaracaoAtributos> ::= <Argumento> ',' <DeclaracaoAtributos> | <Argumento> |
!Métodos
<Metodo> ::= 'method' <Tipo> Identificador '(' <Parametros> ')' '{' <CodigoMetodo> 'return' <Return Met> ';' '}'
| 'method' 'void' Identificador '(' <Parametros> ')' '{' <CodigoMetodo> '}'
!| 'method' <Tipo> Identificador '(' <Parametros> ')' '{' <CodigoMetodo> 'return' '(' <Return Met> ')' ';' '}' expressão já tem parênteses. retirar na refatoração
<Return Met> ::= <Expressao> | !<Expr Arit> Identificador | <valorSemNum> | expressão já abrange todos esses casos
<CodigoMetodo> ::= <blocovar> <Codigo> | <Metodo> <Codigo> | <Atribuicao> <Codigo>| <If> <Codigo> | <While> <Codigo> | <Read> <Codigo> | <Write> <Codigo> | <ChamdaMetodoObjeto> <Codigo>|
<Parametros> ::= <Tipos> <Argumento> ',' <Parametros> | <Tipos> <Argumento> |
!Aleatorios
<Atribuicao> ::= Identificador '=' <Expr Arit> ';' | Identificador '=' ValorSemNum | Identificador '=' <ChamdaMetodoObjeto>
| Identificador '=' <Acesso a atributo>';' | <Acesso a atributo> '='<valorInicial>';'
<Argumento> ::= Identificador | <Vetor> | <Matriz>
<Tipos> ::= <Tipo> | <NomeClasse>
!Vetores e Matrizes
<Vetor> ::= Identificador '[' <Valores> ']'
<Matriz> ::= Identificador '[' <Valores> ']' '[' <Valores> ']'
<Valores> ::= Identificador | Numero
!If
<If> ::= 'if' '(' <Expressao> ')' 'then' '{' <Codigo> '}'
| 'if' '(' <Expressao> ')' 'then' '{' <Codigo> '}' 'else' '{' <Codigo> '}'
| 'if' '(' <Expressao> ')' 'then' '{' <Codigo> '}' 'else' <If>
! Expressões lógicas toda expressão lógica deve vim entre parênteses
<Expressao> ::= <Negado><ExpressoesBooleanas> | <Negado><ExpressaoLogica> | <Negado><ExpressoesBooleanas><OperLogicoConcat><Expressao>
| <Negado><ExpressaoLogica><OperLogicoConcat><Expressao>
<Negado> ::= '!' |
<ExpressaoLogica> ::= '('<ExpressaoElemento><OperadorRelacional><ExpressaoElemento>')'
<ExpressaoElemento> ::= Identificador | <MetodoComoParametro> | <Acesso a atributo> | Numero | CadeiaDeCaracteres !falta vetor em uma posição
<ExpressoesBooleanas> ::= Identificador | Boolean | <MetodoComoParametro> | <Acesso a atributo> | <ChamadaMetodoLocal> ! falta vetor em uma posição que pode ser booleano
!<Valor> ::= Identificador | Numero <-- COMENTADO PELO FATO DE JA EXISTIR UM NAO TERMINAL VALOR
!While
<While> ::= 'while' '(' <Expressao> ')' '{' <Codigo> '}'
!Read e Write
<Read> ::= 'read' '(' <ParametrosLeitura> ')' ';'
<ParametrosLeitura> ::= <Argumento> ',' <ParametrosLeitura> | <Acesso a atributo>',' <ParametrosLeitura>
| <Acesso a atributo> | <Argumento>
<Write> ::= 'write' '(' <ParametrosEscrita> ')' ';'
<ParametrosEscrita> ::= <Argumento> ',' <ParametrosEscrita> | <Acesso a atributo>',' <ParametrosEscrita>
| <Acesso a atributo> | <Argumento> | '"' Identificador '"'
!Expressoes aritméticas
<Expr Arit> ::= <Mult Exp> '+' <Expr Arit> | <Mult Exp> '-' <Expr Arit> | <Mult Exp>
<Mult Exp> ::= <Negate Exp> '*' <Mult Exp> | <Negate Exp> '/' <Mult Exp> | <Negate Exp>
<Valor Exp> ::= Numero | Identificador | Identificador'['<numero>']' | <rtMet> | '('<Expr Arit>')'
<Negate Exp> ::= '-' <Valor Exp> | <Valor Exp>
!Expressoes Lógicas e Relacionais
!Obs.: toda expressão negada deve vim entre parentíse -> ex. if(!(isVerdade)) ou if(vasco == serieA && !(vasco > ibis)) print('Vasco ainda é um clube');
!<simLog> ::= '||' | '&&'
!<simRel> ::= '<' | '<=' | '>=' | '>' | '==' | '='
!<operacao> ::= <opLr> | <opLr> <operacao>
!<opLr> ::= <opLog> | <opRel> | <opLog> <opLr> | <opRel> <opLr>
!<termoLog> ::= Identificador | <opRel> | <rtMet>
!<opLog> ::= <termoLog> <simLog> <termoLog> | <termoLog> <simLog> <termoLog> <opLog> | '!' '(' <termoLog> ')' <simLog> <termoLog> | '!' '(' <termoLog> ')' <simLog> <termoLog> <opLog> | <termoLog> <simLog> '!' '(' <termoLog> ')' | <termoLog> <simLog> '!' '(' <termoLog> ')' <opLog>
!<termoRel> ::= Numero | Identificador | <rtMet>
!<opRel> ::= <termoRel> <simRel> <termoRel> | <termoRel> <simRel> <termoRel> <opRel>
<arg> ::= Identificador | Numero | ',' <arg> | <vazio>
<rtMet> ::= Identificador '.' Identificador '(' <arg> ')'
!Chamadas a métodos a partir de um objeto
<NomeMetodo> ::= Identificador
<NomeObjeto> ::= Identificador
<ParametroCM> ::= <valorSemNum> | Identificador | <MetodoComoParametro> | '('<Expr Arit>')' | <Acesso a atributo> |
<ParametroCM-2> ::= <ParametroCM> | <ParametroCM> ',' <ParametroCM-2>
<MetodoComoParametro> ::= <NomeObjeto> '.' <NomeMetodo> '(' <ParametroCM-2> ')'
<ChamdaMetodoObjeto> ::= <MetodoComoParametro> ';'
<ChamadaMetodoLocal> ::= <NomeMetodo> '(' <ParametroCM-2> ')'