PADRES
=======

  Conveno para os padres:
    + : significa que dever ocorrer uma ou mais vezes.
    * : significa que dever ocorrer nenhuma, uma ou mais vezes.
    ? : significa que dever ocorrer nenhuma ou uma vez.
    []: significa conjunto
    - : significa intervalo. Exemplo: a-z, so todas as letras de "a" a "z".
    | : significa ou. Exemplo: a | b, pode ser a ocorrencia de a ou b.

	Ident -> ( [a-zA-Z] | _ )+ [0-9]*
	Texto -> " [PADRO ASCHII]* "
	Int   -> [0-9]+
	Dec   -> [0-9]+ ( , [0-9]+ )?
	Char  -> " [a-zA-Z] "


PALAVRAS RESERVADAS
===================

 	Se
	Copia
	Vazio
	Zero
	Data
	Extenso
	Numero
	SomaData
	Tamanho
	E
	Ou


GRAMATICA
=========

          [1]
<bol> ::= <ins> <rel> <ins> <rsl>

          [2]     [3]
<exp> ::= <ins> | 

          [4]
<ins> ::= <cmd> <res>

          [5]         [6]
<cmd> ::= ( <ins> ) | <fat>

          [7]           [8]
<res> ::= <ope> <ins> | 

          [9]   [10]  [11]  [12] [37]
<ope> ::=  +  |  -  |  *  |  /  |  ^

          [13]  [14]  [15]   [16]   [17]  [18]
<rel> ::=  >  |  <  |  >=  |  <=  |  =  |  <>

          [19]         [20]
<rsl> ::= <log> <bol> | 

          [21]  [22]
<log> ::=  E  |  Ou

          [23]
<fat> ::= Ident |

          [24]
          Texto |

          [25]
          Decimal |

          [26]
          Inteiro |

          [27]
          Char |

          [28]
          Se ( <bol> ; <exp> ; <exp> ) |

          [29]
          Copia ( <ins> ; <ins> ; <ins> ) |

          [30]
          Vazio ( <ins> ; <ins> ; Char ) |

          [31]
          Zero ( <ins> ; <ins> ) |

          [32]
          Data ( <ins> ; Texto ) |

          [33]
          Extenso ( <ins> ) |

          [34]
          Numero ( <ins> ; Texto ) |

          [35]
          SomaData ( <ins> ; <ins> ) |

          [36]
          Tamanho ( <ins> )|

          [38]
          Log10 ( <ins> )


FIRST
=====

first(<bol>) =
	first(<ins>)
	{ (, Ident, Texto, Decimal, Inteiro, Char, Se, Copia, Vazio, Zero, Data, Extenso, Numero, SomaData, Tamanho, Log10 }

first(<exp>) =
	first(<ins>)
	{ (, Ident, Texto, Decimal, Inteiro, Char, Se, Copia, Vazio, Zero, Data, Extenso, Numero, SomaData, Tamanho, Log10 }

first(<ins>) =
	first(<cmd>)
	{ (, Ident, Texto, Decimal, Inteiro, Char, Se, Copia, Vazio, Zero, Data, Extenso, Numero, SomaData, Tamanho, Log10 }

first(<cmd>) =
	{ ( } U first(<fat>)
	{ (, Ident, Texto, Decimal, Inteiro, Char, Se, Copia, Vazio, Zero, Data, Extenso, Numero, SomaData, Tamanho, Log10 }

first(<res>) =
	first(<ope>) U {  }
	{ +, -, *, /, ^,  }

first(<ope>) =
	{ +, -, *, /, ^ }

first(<rel>) =
	{ >, <, >=, <=, =, <> }

first(<rsl>) =
	first(<log>) U {  }
	{ E, Ou,  }

first(<log>) =
	{ E, Ou }

first(<fat>) =
	{ Ident, Texto, Decimal, Inteiro, Char, Se, Copia, Vazio, Zero, Data, Extenso, Numero, SomaData, Tamanho, Log10 }


FOLLOW
======

follow(<bol>) =
	{ $ } U follow(<rsl>) U { ; }
	{ $, ; }

follow(<exp>) =
	{ ;, ) }

follow(<ins>) =
	first(<rel>) U first(<rsl>) U follow(<exp>) U { ) } U follow(<res>) U { ; } U { ) }
	{ >, <, >=, <=, =, <> } U { E, Ou,  } U { ;, ) } U { ) } U { ; } U { ) }
	{ ), ;, E, Ou, >, <, >=, <=, =, <> } U follow(<bol>)
	{ $, ), ;, E, Ou, >, <, >=, <=, =, <> }

follow(<cmd>) =
	first(<res>)
	{ +, -, *, /, ^,  }
	{ +, -, *, /, ^ } U follow(<ins>)
	{ $, ), ;, E, Ou, >, <, >=, <=, =, <>, +, -, *, /, ^ }

follow(<res>) =
	follow(<ins>)
	{ $, ), ;, E, Ou, >, <, >=, <=, =, <> }

follow(<ope>) =
	first(<ins>)
	{ (, Ident, Texto, Decimal, Inteiro, Char, Se, Copia, Vazio, Zero, Data, Extenso, Numero, SomaData, Tamanho, Log10 }

follow(<rel>) =
	first(<ins>)
	{ (, Ident, Texto, Decimal, Inteiro, Char, Se, Copia, Vazio, Zero, Data, Extenso, Numero, SomaData, Tamanho, Log10 }

follow(<rsl>) =
	follow(<bol>)
	{ $, ; }

follow(<log>) =
	first(<bol>)
	{ (, Ident, Texto, Decimal, Inteiro, Char, Se, Copia, Vazio, Zero, Data, Extenso, Numero, SomaData, Tamanho, Log10 }

follow(<fat>) =
	follow(<cmd>)
	{ $, ), ;, E, Ou, >, <, >=, <=, =, <>, +, -, *, / }



ANLISE SINTTICA                                       ALGORITMO DA ANLISE SINTTICA PREDITIVA NO RECURSIVA
=================                                       ======================================================
                  _____________________
         Entrada |_____|_a_|_+_|_b_|_$_|               | faa ip apontar para o primeiro smbolo da entrada
                           ^                           | repetir
                           |                           |   seja 'X' o smbolo ao topo da pilha e 'a' o smbolo apontado por ip;
         ___      _________|___________                |   se 'X' for um terminal ou $ ento
  Pilha |_A_|    |                     |               |     se 'X' = 'a' ento
        |_B_|    | Programa de Anlise |               |       remover 'X' da pilha e avanar ip
        |_C_|<---| Sinttica Preditiva |----> Sada    |       seno erro()
        |_$_|    |_____________________|               |   seno                 // X  um no-terminal
                           |                           |     se M[X,a] = X -> Y1Y2...Yk ento  // ou seja, se  uma produo
                           |                           |       incio
                  _________v___________                |         remover X da pilha;
                 |                     |               |         empilhar Yk,Yk-1, ..., Y1, com Y1 ao topo da pilha;
                 | Tabela Sinttica    |               |         escrever a produo X -> Y1Y2...Yk
                 |        M            |               |       fim
                 |_____________________|               |     seno erro();
                                                       | at que 'X' = $;



TABELA SINTTICA "M"
====================

                 0       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
   --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|----|-------|
  |        | Ident | Texto | Char | Decimal | Inteiro | Se | Copia | Vazio | Zero | Data | Extenso | Numero | SomaData | Tamanho |  E  | Ou |  (  |  )  |  <  |  >  | <= | >= |  =  | <> |  *  |  /  |  -  |  +  |  ;  |  $  |  ^ | Log10 |
  |--------|-------|-------|------|---------|---------|----|-------|-------|------|------|---------|--------|----------|---------|-----|----|-----|-----|-----|-----|----|----|-----|----|-----|-----|-----|-----|-----|-----|----|-------|
0 | <bol>  |     1 |     1 |    1 |       1 |       1 |  1 |     1 |     1 |    1 |    1 |       1 |      1 |        1 |       1 |  -1 | -1 |   1 |  -1 |  -1 |  -1 | -1 | -1 |  -1 | -1 |  -1 |  -1 |  -1 |  -1 |  -1 |  -1 | -1 |     1 |
  |--------|-------|-------|------|---------|---------|----|-------|-------|------|------|---------|--------|----------|---------|-----|----|-----|-----|-----|-----|----|----|-----|----|-----|-----|-----|-----|-----|-----|----|-------|
1 | <exp>  |     2 |     2 |    2 |       2 |       2 |  2 |     2 |     2 |    2 |    2 |       2 |      2 |        2 |       2 |  -2 | -2 |   2 |   3 |  -2 |  -2 | -2 | -2 |  -2 | -2 |  -2 |  -2 |  -2 |  -2 |   3 |  -2 | -2 |     2 |
  |--------|-------|-------|------|---------|---------|----|-------|-------|------|------|---------|--------|----------|---------|-----|----|-----|-----|-----|-----|----|----|-----|----|-----|-----|-----|-----|-----|-----|----|-------|
2 | <ins>  |     4 |     4 |    4 |       4 |       4 |  4 |     4 |     4 |    4 |    4 |       4 |      4 |        4 |       4 |  -1 | -1 |   4 |  -1 |  -1 |  -1 | -1 | -1 |  -1 | -1 |  -1 |  -1 |  -1 |  -1 |  -1 |  -1 | -1 |     4 |
  |--------|-------|-------|------|---------|---------|----|-------|-------|------|------|---------|--------|----------|---------|-----|----|-----|-----|-----|-----|----|----|-----|----|-----|-----|-----|-----|-----|-----|----|-------|
3 | <cmd>  |     6 |     6 |    6 |       6 |       6 |  6 |     6 |     6 |    6 |    6 |       6 |      6 |        6 |       6 |  -1 | -1 |   5 |  -1 |  -1 |  -1 | -1 | -1 |  -1 | -1 |  -1 |  -1 |  -1 |  -1 |  -1 |  -1 | -1 |     6 |
  |--------|-------|-------|------|---------|---------|----|-------|-------|------|------|---------|--------|----------|---------|-----|----|-----|-----|-----|-----|----|----|-----|----|-----|-----|-----|-----|-----|-----|----|-------|
6 | <res>  |    -3 |    -3 |   -3 |      -3 |      -3 | -3 |    -3 |    -3 |   -3 |   -3 |      -3 |     -3 |       -3 |      -3 |   8 |  8 |  -3 |   8 |   8 |   8 |  8 |  8 |   8 |  8 |   7 |   7 |   7 |   7 |   8 |   8 |  7 |    -3 |
  |--------|-------|-------|------|---------|---------|----|-------|-------|------|------|---------|--------|----------|---------|-----|----|-----|-----|-----|-----|----|----|-----|----|-----|-----|-----|-----|-----|-----|----|-------|
5 | <ope>  |    -4 |    -4 |   -4 |      -4 |      -4 | -4 |    -4 |    -4 |   -4 |   -4 |      -4 |     -4 |       -4 |      -4 |  -4 | -4 |  -4 |  -4 |  -4 |  -4 | -4 | -4 |  -4 | -4 |  11 |  12 |  10 |   9 |  -4 |  -4 | 37 |    -4 |
  |--------|-------|-------|------|---------|---------|----|-------|-------|------|------|---------|--------|----------|---------|-----|----|-----|-----|-----|-----|----|----|-----|----|-----|-----|-----|-----|-----|-----|----|-------|
6 | <rel>  |    -6 |    -6 |   -6 |      -6 |      -6 | -6 |    -6 |    -6 |   -6 |   -6 |      -6 |     -6 |       -6 |      -6 |  -6 | -6 |  -6 |  -6 |  14 |  13 | 16 | 15 |  17 | 18 |  -6 |  -6 |  -6 |  -6 |  -6 |  -6 | -6 |    -6 |
  |--------|-------|-------|------|---------|---------|----|-------|-------|------|------|---------|--------|----------|---------|-----|----|-----|-----|-----|-----|----|----|-----|----|-----|-----|-----|-----|-----|-----|----|-------|
7 | <rsl>  |    -7 |    -7 |   -7 |      -7 |      -7 | -7 |    -7 |    -7 |   -7 |   -7 |      -7 |     -7 |       -7 |      -7 |  19 | 19 |  -7 |  -7 |  -7 |  -7 | -7 | -7 |  -7 | -7 |  -7 |  -7 |  -7 |  -7 |  20 |  20 | -7 |    -7 |
  |--------|-------|-------|------|---------|---------|----|-------|-------|------|------|---------|--------|----------|---------|-----|----|-----|-----|-----|-----|----|----|-----|----|-----|-----|-----|-----|-----|-----|----|-------|
8 | <log>  |    -8 |    -8 |   -8 |      -8 |      -8 | -8 |    -8 |    -8 |   -8 |   -8 |      -8 |     -8 |       -8 |      -8 |  21 | 22 |  -8 |  -8 |  -8 |  -8 | -8 | -8 |  -8 | -8 |  -8 |  -8 |  -8 |  -8 |  -8 |  -8 | -8 |    -8 |
  |--------|-------|-------|------|---------|---------|----|-------|-------|------|------|---------|--------|----------|---------|-----|----|-----|-----|-----|-----|----|----|-----|----|-----|-----|-----|-----|-----|-----|----|-------|
9 | <fat>  |    23 |    24 |   27 |      25 |      26 | 28 |    29 |    30 |   31 |   32 |      33 |     34 |       35 |      36 |  -5 | -5 |  -5 |  -5 |  -5 |  -5 | -5 | -5 |  -5 | -5 |  -5 |  -5 |  -5 |  -5 |  -5 |  -5 | -5 |    38 |
   -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------|

CDIGOS DE ERROS SINTTICOS
===========================

  Obs.: Os cdigos de erros usam nmeros negativos para se diferenciarem dos
        cdigos das produes.

  Cdigo  Descrio
  ======  =========
      -1  Campo, Texto, Nmero, Funo ou '(' esperado
      -2  Campo, Texto, Nmero, Funo, '(', ')' ou ';' esperado
      -3  'E', 'Ou', ')', '+', '-', '*', '/', '>', '<', '>=', '<=', '<>' ou ';' esperado
      -4  '+', '-', '*' ou '/' esperado
      -5  Campo, Texto, Nmero ou Funo esperada
      -6  '>', '<', '>=', '<=', '=' ou '<>' esperado
      -7  'E', 'Ou' ou ';' esperado
      -8  'E' ou 'Ou' esperado

