Notazione postfissa con ANTLR e lo Shunting-yard algorithm

Lo Shunting-yard algorithm è un algoritmo per effettuare il parsing di una espressione matematica in notazione infissa e generare un’espressione in notazione postfissa (Reverse Polish notation).

L’algoritmo fa uso di uno stack per i risultati intermedi e di una coda di output.
In questo articolo, l’espressione matematica verrà tokenizzata con l’ausilio di ANTLR. Genereremo un lexer che ci permetterà di iterare sui token della stringa e di applicare l’algoritmo.

Continua >

Rimuovere le ε-produzioni da una grammatica CF

Dato un linguaggio $latex L$ generato da una grammatica context free $latex G$, il linguaggio $latex L\setminus\{\epsilon\}$ è un linguaggio CF generato da una grammatica $latex G’$ senza simboli inutili e senza ε-produzioni.

Possiamo di conseguenza eliminare le ε-produzioni da una grammatica e ottenere una grammatica che genera lo stesso linguaggio (ammettendo $latex S \rightarrow \epsilon$ se $latex \epsilon \in L$).

Continua >

Mootools e la classe Chain

Mootools consente, attraverso la classe Chain, di poter aggiungere delle funzioni ad un oggetto, da eseguire in sequenza. I metodi esposti sono:

myClass.chain(fn[, fn2[, fn3[, ...]]]);
myClass.callChain([any arguments]);
myClass.clearChain();

rispettivamente per aggiungere una o più funzioni, per richiamare la prossima funzione nella catena e per pulire la catena.

Continua >

Eseguire una funzione con delay utilizzando Mootools

Mootools consente di creare funzioni eseguibili dopo un periodo di tempo specificato.
Nell’esempio qui di seguito, dopo un secondo dal caricamento della pagina verrà avviata una funzione che mostrerà un paragrafo nascosto:

<html>
  <head>
    <style>
      .invisible {
        display: none;
      }
      .visible {
        display: inline;
      }
    </style>
    <script src="mootools-core-latest.js"></script>
    <script>
      var func = function() {
        var id = arguments[0]
    	  var attr = arguments[1];
    	  var val = arguments[2];
    	  $(id).set(attr, val);
      }

      func.delay(1000, null, ["Text", "class", "visible"]);
    </script>
  </head>
  <body>
    <p id="Text" class="invisible">
      Lorem ipsum dolor sit amet, consectetur adipiscing elit.<br/>
      Morbi metus quam, hendrerit at adipiscing quis, lacinia quis lectus.<br/>
      Etiam in urna ac odio dapibus vulputate sed eget orci. <br/>
      Pellentesque eget mollis libero. <br/>
      Pellentesque nec tortor pharetra est volutpat sagittis.<br/>
      Vivamus nunc nisl, viverra sed facilisis eu, fringilla id enim<br/>
    </p>
  </body>
</html>

Validazione di un form con JQuery

La validazione di un form può avvenire in maniera molto semplice utilizzando il plugin Validation di JQuery.
In questo articolo verrà mostrato un semplice esempio di validazione.
I campi saranno tutti richiesti e, inoltre, l’URL dovrà essere valido per poter essere accettato:

<html>
  <head>
    <style>
      body {
        text-align:center;
        margin:0 auto;
      }

      .content {
        width: 500px;
        margin-left: auto;
        margin-right: auto;
        text-align: center;
        align: center;
      }

      .content table {
        margin-left: auto;
        margin-right: auto;
        align: center;
      }

      td {
        padding: 15 20 5 50;
      }           

      tr.submitButton td {
        padding-bottom: 50px;
        padding-top: 50px;
        text-align: center
      }

			p.title {
				font-family:"Adobe Caslon Pro",
				            "Hoefler Text",Georgia,Garamond,Times,serif;
				font-size:18pt;
				font-variant:small-caps;
				letter-spacing:0.2em;
				text-align:center;
			}      

			div.jqError {
			  height: 50px;
			  color: red;
			  font-style: oblique;
			  font-family: serif;
			  font-weight: bolder;
			}

			img.errGif {
			 padding-right: 20px;
			}

			input.error {
			  border: 2px solid red;
			  background-color: #FFFF53;
			}
    </style>
  </head>
  <script src="http://code.jquery.com/jquery-1.4.2.min.js"></script>
  <script src="http://ajax.microsoft.com/ajax/jquery.validate/1.7/jquery.validate.min.js"></script>
  <script type="text/javascript">
    // sovrascriviamo i messaggi standard
    $.validator.messages.required = "";
    $.validator.messages.url = "";
    var formName = "#AnagForm";

    $(document).ready(function()
    {
    	$(formName).validate({
    	  rules:
    		  {
    		    Name: { required: true },
    		    Lastname: { required: true },
    		    Site: {required: true, url: true},
    		    Username: {required: true}
    		  },
    		invalidHandler: function(e, v)
    		    {
    			    var errs = v.numberOfInvalids();

    			    if(errs)
    			    {
        			  var str = errs>1 ?
                			  ("Ci sono " + errs + " errori") :
                				("C'&egrave; un errore");
    			      $("div[class=jqError]").html(
    			    		  "<img class=\"errGif\" src=\"error.gif\"/>" + str);
    			    }
  	    		}
    	});
	  });
  </script>
  <body>
      <form id="AnagForm" action="http://antoniotancredi.altervista.org">
        <div class="content">
          <p class="title">REGISTRAZIONE</p>
          <div class="jqError"></div>
          <table>
            <tr>
              <td><label for="Name">Nome: </label></td>
              <td><input type="text" name="Name"/></td>
            </tr>
            <tr>
              <td><label for="Lastname">Cognome: </label></td>
              <td><input type="text" name="Lastname"/></td>
            </tr>
            <tr>
              <td><label for="Site">Sito Web: </label></td>
              <td><input type="text" name="Site"/></td>
            </tr>
            <tr>
              <td><label for="Username">Username: </label></td>
              <td><input type="text" name="Username"/></td>
            </tr>
            <tr class="submitButton">
              <td colspan="2"><input type="submit" value="Conferma"/></td>
            </tr>
          </table>
        </div>
      </form>
  </body>
</html>

JSP: gestire le eccezioni con la direttiva page

La direttiva page delle pagine JSP possiede un attributo, errorPage, che permette di specificare una pagina di errore da mostrare in caso avvenga un’eccezione non gestita.
La pagina di errore può settare a true l’attributo isErrorPage, in modo da ottenere l’oggetto implicito exception e ricavare la fonte dell’eccezione.

Continua >

I Generics Java

I generics in Java, introdotti a partire dalla versione 1.5, consentono di definire un’astrazione sul tipo di oggetto da utilizzare in una classe, similmente a quanto avviene utilizzando i template in C++.

Per creare una classe generica, scriviamo qualcosa simile alla seguente porzione di codice:

public class GenericsTest
{
	public static class Pair<S, T>
	{
		public S first;
		public T second;

		public Pair(S first, T second)
		{
			this.first = first;
			this.second = second;
		}
	}

	public static void main(String[] args)
	{
		Pair<String, Integer> pair =
			new Pair<String, Integer>("Antonio", 22);
		System.out.println(pair.first + ", " + pair.second);
	}
}

Continua >

Creare un modello personalizzato per una JTable

In Java, ogni tabella utilizza un modello per gestire i dati rappresentati.
Il modello in questione deve implementare i metodi definiti nell’interfaccia javax.swing.table.TableModel. Qualora non venisse specificato un modello, la classe JTable crea un’istanza di javax.swing.table.DefaultTableModel

Table model

Continua >

Java: introduzione alla classe JFileChooser

La classe javax.swing.JFileChooser consente un semplice ed immediato meccanismo per selezionare file e directory.
Il più semplice modo per istanziare questa classe è usare il costruttore:

JFileChooser(String currentDirectoryPath)

specificando il percorso di una directory, che verrà mostrata quando verrà aperto il file chooser.

Per indicare il tipo di file che deve essere scelto (file, directory o entrambi), utilizziamo il metodo

public void setFileSelectionMode(int mode)

dove mode è un dei seguenti valori:

  • JFileChooser.FILES_ONLY
  • JFileChooser.DIRECTORIES_ONLY
  • JFileChooser.FILES_AND_DIRECTORIES

Se invece vogliamo abilitare/disabilitare la selezione multipla, utilizziamo il metodo:

public void setMultiSelectionEnabled(boolean b)

Continua >

Definire una classe in Javascript

La definizione di una classe in Javascript avviene utilizzando una funzione come template.
Le classi possono contenere sia proprietà che metodi.
Le proprietà vengono specificate utilizzando la parola chiave this.
I metodi possono essere aggiunto all’oggetto prototype della Function (o si può assegnare ad una proprietà una funzione).
Consideriamo ad esempio l’oggetto Person:

function Person(firstname, lastname) {
	this.firstname = firstname;
	this.lastname = lastname;
}

Person.prototype.formattedName = function() {
	return this.firstname + " " + this.lastname;
};

Tale classe contiene le proprietà firstname e lastname, più il metodo formattedName, aggiunto nel prototipo della function (Prototype-based programming)

Continua >