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]     [2]
<exp> ::= <ins> | 

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

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

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

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

          [12]
<fat> ::= Ident |

          [13]
          Texto |

          [14]
          Decimal |

          [15]
          Inteiro |

          [16]
          Char |

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

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

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

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

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

          [22]
          Extenso ( <ins> ) |

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

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

          [25]
          Tamanho ( <ins> ) |

          [38]
          Log10 ( <ins> )

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

          [27]  [28]  [29]   [30]   [31]  [32]
<rel> ::=  >  |  <  |  >=  |  <=  |  =  |  <>

          [33]          [34]
<rsl> ::= <log> <bol> | 

          [35]   [36]
<log> ::=  E  |  Ou


FIRST
=====

first(<exp>) =
  first(<ins>) U {  }
  { (, 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(<fat>) =
  { Ident, Texto, Decimal, Inteiro, Char, Se, Copia, Vazio, Zero, Data, Extenso, Numero, SomaData, Tamanho, Log10 }

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

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

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

first(<log>)
  { E, Ou }


FOLLOW
======

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

follow(<ins>) =
  follow(<exp>) U { ) } U follow(<res>) U { ; } U first(<rel>) U first(<rsl>)
  { $, ), ;, >, <, >=, <=, =, <>, E, Ou,  }
  { $, ), ;, >, <, >=, <=, =, <>, 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(<fat>) =
  follow(<cmd>)
  { $, ), ;, >, <, >=, <=, =, <>, E, Ou, +, -, *, /, ^ }

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

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 }



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 |RaizQuadrada|
  |--------|-------|-------|------|---------|---------|----|-------|-------|------|------|---------|--------|----------|---------|-----|----|-----|-----|-----|-----|----|----|-----|----|-----|-----|-----|-----|-----|-----|----|-------|------------|
0 | <exp>  |     1 |     1 |    1 |       1 |       1 |  1 |     1 |     1 |    1 |    1 |       1 |      1 |        1 |       1 |  -1 | -1 |   1 |   2 |  -1 |  -1 | -1 | -1 |  -1 | -1 |  -1 |  -1 |  -1 |  -1 |   2 |   2 | -1 |     1 |      1     |
  |--------|-------|-------|------|---------|---------|----|-------|-------|------|------|---------|--------|----------|---------|-----|----|-----|-----|-----|-----|----|----|-----|----|-----|-----|-----|-----|-----|-----|----|-------|------------|
1 | <ins>  |     3 |     3 |    3 |       3 |       3 |  3 |     3 |     3 |    3 |    3 |       3 |      3 |        3 |       3 |  -1 | -1 |   3 |  -1 |  -1 |  -1 | -1 | -1 |  -1 | -1 |  -1 |  -1 |  -1 |  -1 |  -1 |  -1 | -1 |     3 |      3     |
  |--------|-------|-------|------|---------|---------|----|-------|-------|------|------|---------|--------|----------|---------|-----|----|-----|-----|-----|-----|----|----|-----|----|-----|-----|-----|-----|-----|-----|----|-------|------------|
2 | <cmd>  |     5 |     5 |    5 |       5 |       5 |  5 |     5 |     5 |    5 |    5 |       5 |      5 |        5 |       5 |  -1 | -1 |   4 |  -1 |  -1 |  -1 | -1 | -1 |  -1 | -1 |  -1 |  -1 |  -1 |  -1 |  -1 |  -1 | -1 |     5 |      5     |
  |--------|-------|-------|------|---------|---------|----|-------|-------|------|------|---------|--------|----------|---------|-----|----|-----|-----|-----|-----|----|----|-----|----|-----|-----|-----|-----|-----|-----|----|-------|------------|
3 | <res>  |    -2 |    -2 |   -2 |      -2 |      -2 | -2 |    -2 |    -2 |   -2 |   -2 |      -2 |     -2 |       -2 |      -2 |   7 |  7 |  -2 |   7 |   7 |   7 |  7 |  7 |   7 |  7 |   6 |   6 |   6 |   6 |   7 |   7 |  6 |    -2 |     -2     |
  |--------|-------|-------|------|---------|---------|----|-------|-------|------|------|---------|--------|----------|---------|-----|----|-----|-----|-----|-----|----|----|-----|----|-----|-----|-----|-----|-----|-----|----|-------|------------|
4 | <ope>  |    -3 |    -3 |   -3 |      -3 |      -3 | -3 |    -3 |    -3 |   -3 |   -3 |      -3 |     -3 |       -3 |      -3 |  -3 | -3 |  -3 |  -3 |  -3 |  -3 | -3 | -3 |  -3 | -3 |  10 |  11 |   9 |   8 |  -3 |  -3 |  37|    -3 |     -3     |
  |--------|-------|-------|------|---------|---------|----|-------|-------|------|------|---------|--------|----------|---------|-----|----|-----|-----|-----|-----|----|----|-----|----|-----|-----|-----|-----|-----|-----|----|-------|------------|
5 | <fat>  |    12 |    13 |   16 |      14 |      15 | 17 |    18 |    19 |   20 |   21 |      22 |     23 |       24 |      25 |  -4 | -4 |  -4 |  -4 |  -4 |  -4 | -4 | -4 |  -4 | -4 |  -4 |  -4 |  -4 |  -4 |  -4 |  -4 | -4 |    38 |     42     |
  |--------|-------|-------|------|---------|---------|----|-------|-------|------|------|---------|--------|----------|---------|-----|----|-----|-----|-----|-----|----|----|-----|----|-----|-----|-----|-----|-----|-----|----|-------|------------|
6 | <bol>  |    26 |    26 |   26 |      26 |      26 | 26 |    26 |    26 |   26 |   26 |      26 |     26 |       26 |      26 |  -1 | -1 |  26 |  -1 |  -1 |  -1 | -1 | -1 |  -1 | -1 |  -1 |  -1 |  -1 |  -1 |  -1 |  -1 | -1 |    26 |     26     |
  |--------|-------|-------|------|---------|---------|----|-------|-------|------|------|---------|--------|----------|---------|-----|----|-----|-----|-----|-----|----|----|-----|----|-----|-----|-----|-----|-----|-----|----|-------|------------|
7 | <rel>  |    -5 |    -5 |   -5 |      -5 |      -5 | -5 |    -5 |    -5 |   -5 |   -5 |      -5 |     -5 |       -5 |      -5 |  -5 | -5 |  -5 |  -5 |  28 |  27 | 30 | 29 |  31 | 32 |  -5 |  -5 |  -5 |  -5 |  -5 |  -5 | -5 |    -5 |     -5     |
  |--------|-------|-------|------|---------|---------|----|-------|-------|------|------|---------|--------|----------|---------|-----|----|-----|-----|-----|-----|----|----|-----|----|-----|-----|-----|-----|-----|-----|----|-------|------------|
8 | <rsl>  |    -6 |    -6 |   -6 |      -6 |      -6 | -6 |    -6 |    -6 |   -6 |   -6 |      -6 |     -6 |       -6 |      -6 |  33 | 33 |  -6 |  -6 |  -6 |  -6 | -6 | -6 |  -6 | -6 |  -6 |  -6 |  -6 |  -6 |  34 |  -6 | -6 |    -6 |     -6     |
  |--------|-------|-------|------|---------|---------|----|-------|-------|------|------|---------|--------|----------|---------|-----|----|-----|-----|-----|-----|----|----|-----|----|-----|-----|-----|-----|-----|-----|----|-------|------------|
9 | <log>  |    -7 |    -7 |   -7 |      -7 |      -7 | -7 |    -7 |    -7 |   -7 |   -7 |      -7 |     -7 |       -7 |      -7 |  35 | 36 |  -7 |  -7 |  -7 |  -7 | -7 | -7 |  -7 | -7 |  -7 |  -7 |  -7 |  -7 |  -7 |  -7 | -7 |    -7 |     -7     |
   -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------|------------|


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  'E', 'Ou', ')', '+', '-', '^', '*', '/', '>', '<', '>=', '<=', '<>' ou ';' esperado
      -3  '+', '-', '*' ou '/' esperado
      -4  Campo, Texto, Nmero ou Funo esperada
      -5  '>', '<', '>=', '<=', '=' ou '<>' esperado
      -6  'E', 'Ou' ou ';' esperado
      -7  'E' ou 'Ou' esperado
