/*

    Grammar for bist native file format
    Copyright (C) 2008 Valerio Benfante

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/




Questo file dovrebbe descrivere la grammatica usata dal programma per
salvare le strutture molecolari.

? == uno o piu'
* == 0 o piu'
| == OR logico

Gli spazi  i caratteri di  tabulazione i ritorni  a capo e le  linee che
iniziano col cancelletto ('#')sono ignorati.

atomo 0 : tipo_atomo 0 {

  elemento {
	    etichetta { C_{2}^{++} }, 0,16,-2,1,1,10.8.10.8
	   }

  lista {
    legame {1,0,0}
    legame {2,1,0}
  }

}



gruppo 0: tipo_gruppo 0{

  atomo 1 {
	...
  }

  atomo 2 {
	...
  }


}

stringa { etichetta { C_{6}H_{12}O_{6} }, 10,10 }



APRI   := '{'
CHIUDI := '}'
SEP := ','

IMMAGINE := GRUPPO*  STRINGHE*

GRUPPO   := "gruppo" ID_GRUPPO ":" "tipo_gruppo" TIPO_GRUPPO
				APRI
					ROT*
					ATOMO*
					PROCEDURA*
				CHIUDI


ROT :=  APRI
		XPIVOT	SEP
		YPIVOT 	SEP
		ANGOLOROT
	CHIUDI

TIPO_GRUPPO := (int) tipo di gruppo DA FARE


ID_GRUPPO := (int) identifica univocamente il gruppo.

ATOMO    := "atomo" ID_ATOMO ":" "tipo_atomo" TIPO_ATOMO APRI
	    "elemento" APRI
			ETICHETTA SEP CARICHE
			SEP POSIZIONE_CARICA
			SEP DOPPIETTI SEP EL_SPAIATI
			SEP MASSA
			SEP COLORE SEP COLORE SEP COLORE
			SEP POSX SEP POSY
		       CHIUDI

		    LISTA_DI_ADIACENZA
		CHIUDI




COLORE := (int) una componente (RGB) del colore dell'elemento

MASSA  := (int) Il numero di massa

PROCEDURA := 'ARC' APRI
			ID_PROC SEP XSTART SEP YSTART SEP XEND SEP YEND
			SEP X1  SEP Y1 SEP X2 SEP X2 SEP X3 SEP Y3 SEP X4 SEP Y4
			SEP  COLORE SEP COLORE SEP COLORE SEP XPIVOT SEP
			YPIVOT SEP ANGOLOROT SEP SPESSORE SEP DASH
		   CHIUDI |
	     'ARROW' APRI
			ID_PROC SEP POSX SEP POSY SEP POSX SEP POSY
			SEP COLORE SEP COLORE SEP COLORE SEP XPIVOT
			SEP YPIVOT SEP ANGOLOROT SEP SPESSORE SEP
			DASH SEP NUMPUNTE SEP ARRW SEP ARRH SEP ARRGAP
		   CHIUDI |
	     'BEZIER' APRI
			ID_PROC SEP POSX SEP POSY SEP POSX SEP POSY
			SEP POSX SEP POSY SEP POSX SEP POSY
			SEP COLORE SEP COLORE SEP COLORE SEP XPIVOT
			SEP YPIVOT SEP ANGOLOROT SEP SPESSORE SEP
			DASH SEP NUMPUNTE SEP ARRW SEP ARRH SEP ARRGAP
		      CHIUDI

	     'BOX'   APRI
			ID_PROC SEP LD_X SEP LD_Y SEP RU_X SEP RU_Y
			SEP COLORE SEP COLORE SEP COLORE SEP XPIVOT
			SEP YPIVOT SEP ANGOLOROT SEP SPESSORE SEP
			DASH SEP BOX_TYPE
		      CHIUDI

LD_X := POSX
LD_Y := POSX

RU_X := POSX
RU_Y := POSX
           (0,0)
             +-------------------------------------------->
             |
             |       (LD_X,LD_Y)
             |        +-----------------------------+
             |        |                             |
             |        |                             |
             |        |                             |
             |        |                             |
             |        |                             |
             |        |                             |
             |        |                             |
             |        |                             |
             |        |                             |
             |        +-----------------------------+
             V                                  (RU_X,RU_Y)


XSTART YSTART XEND YEND
X1  Y1 X2 X2 X3 Y3 X4 Y4 := POSX indicano le posizioni dei punti di
controllo per questa ellisse.

BOX_TYPE := NORMAL_BOX | SHADOWED_BOX

NORMAL_BOX   := 0 
SHADOWED_BOX := 1

XPIVOT := (float) ascissa dell'asse di rotazione di questa procedura

XPIVOT := (float) ordinata dell'asse di rotazione di questa procedura

ANGOLOROT := (float) angolo di rotazione in senso orario.

SPESSORE :=(int) lo spessore della linea che costituisce la procedura in px

DASH  :=(int)  intervallo tra un tratteggio e l'altro: 0 indica nessun tratteggio.

ID_PROC :=  (int) l'identificativo di questa procedura

NUMPUNTE := puo assumere i valori:
		ARR_NO_PUNT
		ARR_OMOL_PUNT
		ARR_ETEROL_PUNT
		ARR_DOUBLE
		ARR_BLOC
		ARR_EQU
Corrispondenti  a  nessuna  freccia,  scissione  omolitica,   scissione
eterolitica, risonanza,  freccia sbarrata ed equilibrio.

ARRW := (float) larghezza della punta (immaginandola orizzontale)

ARRH := (float) altezza della punta (immaginandola orizzontale)

ARRGAP := (float) rientro della punta

/*

  (se la procedura
e' inserita in un gruppo allora il suo id deve coincidere con quello del
gruppo)
*/

TIPO_ATOMO := (int) Ogni elemento ha un numero identificativo pari al
	      numero atomico.


ETICHETTA := "etichetta" APRI

				VALORE SEP FONT SEP DIMENSIONE_FONT
				SEP POSX SEP POSY SEP CR SEP CG SEP CG
				SEP ALLINEAMENTO SEP VALIGN
			CHIUDI

ALLINEAMENTO := (int) 0 | 1 | 2 Indica l'allineamento dell'etichetta
rispetto al suo legame, se esiste, 0=sx 1=cent 2=dx

VALIG := (int) scarto verticale tra la posizione di default
dell'etichetta e quella desiderata

VALORE := CHAR* VALORE*  |  APICE VALORE*
        | APICE PEDICE VALORE*
        |PEDICE VALORE* | PEDICE APICE VALORE*
        | "#"(nessuna etichetta)VALORE* | "."VALORE* (idrogeno verso di noi)


ESCAPED_COMMA= ESCAPE_CHAR ','

ESCAPE_CHAR = '\'

APICE := '^{ CHAR? '}'

PEDICE := '_{ CHAR? '}'

LISTA_DI_ADIACENZA :=  "lista" APRI
			       ( "legame" APRI
				      		ID_ATOMO
						SEP ID_LEGAME
						SEP TIPO_LEGAME
						SEP COLORE
						SEP COLORE
						SEP COLORE
			         	  CHIUDI
			       )?
			       CHIUDI

STRINGHE :=  ( ETICHETTA | MULTILINE_LABEL | PARAGRAPH)


MULTILINE_LABEL := "multiline_label" APRI POSX SEP POSY SEP INTERLINE
                   SEP LAYOUT SEP ETICHETTA* CHIUDI

INTERLINE := (int) space between lines

LAYOUT    :=  1|2|3 center left and right alignement


PARAGRAPH := "paragraph" APRI POSX SEP POSY SEP INTERLINE
                   SEP LAYOUT SEP MULTIFONT_LABEL* CHIUDI


MULTIFONT_LABEL:= "multifont_label" APRI POSX SEP POSY SEP INTERLINE
                   SEP ETICHETTA* CHIUDI


ID_STR := (int) Identificativo della stringa.

CHAR := (char) un carattere | ESCAPE_CHAR CHAR

DOPPIETTI := (int) numero di doppietti

CARICHE := (int) la carica dell'atomo o gruppo

POSIZIONE_CARICA := (int) [0,1,2,3] la posizione della carica secondo
il seguente schema:

	     3 +---------------------+ 0
	       |                     |
	       |                     |
	       |                     |
	       |                     |
	       |                     |
	     2 +---------------------+ 1



EL_SPAIATI := (int) numero di elettroni spaiati

POSX := (float) ascissa

POSY := (float) ordinata

FONT := (int) puo' essere una di queste costanti :


    * 0 FL_HELVETICA - Helvetica (or Arial) normal (0).
    * 1 FL_HELVETICA_BOLD - Helvetica (or Arial) bold.
    * 2 FL_HELVETICA_ITALIC - Helvetica (or Arial) oblique.
    * 3 FL_HELVETICA_BOLD_ITALIC - Helvetica (or Arial) bold-oblique.
    * 4 FL_COURIER - Courier normal.
    * 5 FL_COURIER_BOLD - Courier bold.
    * 6 FL_COURIER_ITALIC - Courier italic.
    * 7 FL_COURIER_BOLD_ITALIC - Courier bold-italic.
    * 8 FL_TIMES - Times roman.
    * 9 FL_TIMES_BOLD - Times bold.
    * 10 FL_TIMES_ITALIC - Times italic.
    * 11 FL_TIMES_BOLD_ITALIC - Times bold-italic.
    * 12 FL_SYMBOL - Standard symbol font.


DIMENSIONE_FONT := (int) dimensione del font in pixel

PROCEDURA := //AGGIUNGERE


ID_ATOMO := (int) identificatore dell'atomo, identifica univocamente
l'atomo all'interno del gruppo.

ID_LEGAME := (int) identificatore del legame

TIPO_LEGAME := (int) tipo legame
	       	*  0 legame singolo
	       	*  1 legame doppio
	       	*  2 legame triplo
	       	*  3 legame "verso l'interno"
		* -3 legame verso l'interno al contrario
		*  4 legame "verso di noi"
		* -4 legame "verso di noi" al contrario
		*  5 legame inspessito
		*  6 legame tratteggiato
		*  7 Legame doppio solido + tratteggiato
		*  8 legame a stereochimica sconosciuta



