Friday, November 10, 2006

Grammar DUDU+ mi lenguaje de programación

Este es el grammar del lenguaje DUDU+, este grammar (BNF production) esta hecho para la generación de un parser con la herramienta javacc. Como se ve la sintaxis es la de java pero con otras reglas, ya que se trata de javacc, que es el generador de parser más popular, se puede encontrar documentación de este en la página: https://javacc.dev.java.net/ . Les recomiendo que utilicen el mailling list en el cual hay personas dispuestas a ayudarte :-D.

/*
* DUDU+ codename MiniJava
* HECHO... in Dominican Republic
* author VГ­ctor Sosa <victornsosa@gmail.com> vns java
*/


options{
LOOKAHEAD = 1;
STATIC = false;
JAVA_UNICODE_ESCAPE = true;
}

PARSER_BEGIN(MiniJava)

import java.util.*;

public class MiniJava {

public static void main(String[] args) throws ParseException, TokenMgrError {

MiniJava parser;
String file = null;
long time = 0;
long parseTime = 0;
long startTime = 0;

if (args.length == 0)
{
System.out.println("Error messages...");
return;

} else if ( args.length == 1 ){
file = args[0];
System.out.println("Start parsing...");

try
{
parser = new MiniJava(new java.io.FileInputStream(file));

} catch ( java.io.FileNotFoundException e ) {

System.out.println("Parser error: Filename " + file + " not found." );
return;
}
} else {
System.out.println("Debe escribir: java MiniJava inputfile");
return;
}
try
{
startTime = System.currentTimeMillis();
parser.Start();
parseTime = System.currentTimeMillis();
time = parseTime - startTime;

System.out.println(" Time of parsing: " + time + " ms");
System.out.println(" DuDu successfully end");

} catch ( ParseException pex) {

System.out.println( pex.getMessage() );
System.out.println(" ParserException during parse file" );
}
}/* main method*/
}

PARSER_END(MiniJava)

/* Eat white space and comment*/
SKIP : {
" "
| "\t"
| "\n"
| "\r"
| <"//" (~["\n","\r"])* ("\n" | "\r" | "\r\n")>
| <"/*" (~["*"])* "*" ("*" | ~["*","/"] (~["*"])* "*")* "/">
}

TOKEN : /* RESERVED WORDS AND LITERALS */
{
< BOOLEAN: "boolean" >
| < BYTE: "byte" >
| < CHAR: "char" >
| < CLASS: "class" >
| < DOUBLE: "double" >
| < FALSE: "false" >
| < FLOAT: "float" >
| < FINAL: "final" >
| < INT: "int" >
| < LONG: "long" >
| < PUBLIC: "public" >
| < SHORT: "short" >
| < STATIC: "static" >
| < TRUE: "true" >
| < VOID: "void" >
| < NEW: "new" >
| < MAKE: "make" >
| < STACK: "stack" >
| < REPEAT: "repeat" >
| < UNTIL: "until" >
| < ADDSTACK: "addStack" >
| < ORDSTACK: "ordStack" >
| < ASCENDENTE: "ascendente" >
| < DESCENDENTE: "descendente" >

}

TOKEN : /* SEPARATORS */
{
< LPAREN: "(" >
| < RPAREN: ")" >
| < LBRACE: "{" >
| < RBRACE: "}" >
| < LBRACKET: "[" >
| < RBRACKET: "]" >
| < SEMICOLON: ";" >
| < COMMA: "," >
}

TOKEN : /* OPERATORS */
{
< ASSIGN: "=" >
| < INCR: "++" >
| < DECR: "--" >
| < PLUS: "+" >
| < MINUS: "-" >
| < STAR: "*" >
| < SLASH: "/" >

}

TOKEN : /* LITERALS */
{
< INTEGER_LITERAL:
< DECIMAL_LITERAL > (["l","L"])?
>
|
< #DECIMAL_LITERAL: ["0"-"9"] (["0"-"9"])* >
|
< FLOATING_POINT_LITERAL:
(["0"-"9"])+ "." (["0"-"9"])* ( < EXPONENT > )? (["f","F","d","D"])?
| "." (["0"-"9"])+ ( < EXPONENT >)? (["f","F","d","D"])?
| (["0"-"9"])+ < EXPONENT > (["f","F","d","D"])?
| (["0"-"9"])+ (< EXPONENT >)? ["f","F","d","D"]
>
|
< #EXPONENT: ["e","E"] (["+","-"])? (["0"-"9"])+ >
|
< CHARACTER_LITERAL:
"'"
( (~["'","\\","\n","\r"])
| ("\\"
( ["n","t","b","r","f","\\","'","\""]
| ["0"-"7"] ( ["0"-"7"] )?
| ["0"-"3"] ["0"-"7"] ["0"-"7"]
)
)
)
"'"
>
|
< STRING_LITERAL:
"\""
( (~["\"","\\","\n","\r"])
| ("\\"
( ["n","t","b","r","f","\\","'","\""]
| ["0"-"7"] ( ["0"-"7"] )?
| ["0"-"3"] ["0"-"7"] ["0"-"7"]
)
)
)*
"\""
>
}

TOKEN : {
<IDENTIFIER: < LETTER > ( < LETTER > | < DIGIT > )*>
| <#LETTER: ["$","A"-"Z","_","a"-"z"]>
| <#DIGIT: ["0"-"9"]>
}


/*********************************************
* THE MINIJAVA LANGUAGE GRAMMAR STARTS HERE *
*********************************************/

/*
* Struts.
*/

void Start() throws ParseException :
{}
{
(TypeDeclaration() )*
}


void TypeDeclaration() :
{}
{
ClassDeclaration()
}

/*
* Declaracion de clases
*/
void ClassDeclaration() :
{}
{
( "final" | "public" | "static" )* "class" < IDENTIFIER >
"{" ( ClassBodyDeclaration() )* "}"

}

void ClassBodyDeclaration() :
{}
{
LOOKAHEAD(2)
FieldDeclaration()
|
Statement()
}

void FieldDeclaration() :
{}
{
( "public" | "static" | "final" )*
Type() VariableDeclarator() ( "," VariableDeclarator() )* ";"

}

void VariableDeclarator() :
{}
{
VariableDeclaratorId() [ "=" VariableInitializer() ]
}

void VariableDeclaratorId() :
{}
{
< IDENTIFIER > ( "[" "]" )*
}

void VariableInitializer() :
{}
{
ArrayInitializer()
|
Expression()

}

void ArrayInitializer() :
{}
{
"{" [ VariableInitializer() ( LOOKAHEAD(2) "," VariableInitializer() )* ] [ "," ] "}"
}

/*
* Tipos, nombre y sentencias
*/
void Type() :
{}
{
PrimitiveType() ( "[" "]" )*
}

void PrimitiveType() :
{}
{
"boolean"
|
"char"
|
"byte"
|
"short"
|
"int"
|
"long"
|
"float"
|
"double"
}

void Name() :
{ }
{
< IDENTIFIER >
}

/*
* Expression syntax
*/

void Expression() :
{}
{
ConditionalExpression() [ AssignmentOperator() AdditiveExpression() ]
}

void AssignmentOperator() :
{}
{
"="
}

void ConditionalExpression() :
{}
{
ConditionalOrExpression() [ "?" Expression() ":" ConditionalExpression() ]
}

void ConditionalOrExpression() :
{}
{
ConditionalAndExpression() ( "||" ConditionalAndExpression() )*

}

void ConditionalAndExpression() :
{}
{
EqualityExpression() ( "&&" EqualityExpression() )*

}

void EqualityExpression() :
{}
{
RelationalExpression() ( ( "==" | "!=" ) RelationalExpression() )*

}

void RelationalExpression() :
{}
{
AdditiveExpression() ( ( "<" | ">" | "<=" | ">=" ) AdditiveExpression() )*

}

void AdditiveExpression() :
{}
{
MultiplicativeExpression() ( LOOKAHEAD(2)( "+" | "-" ) MultiplicativeExpression() )*

}

void MultiplicativeExpression() :
{}
{
UnaryExpression() ( ( "*" | "/" ) UnaryExpression() )*

}

void UnaryExpression() :
{}
{
( "+" | "-" ) UnaryExpression()
|
UnaryExpressionNotPlusMinus()
}

void UnaryExpressionNotPlusMinus() :
{}
{
PostfixExpression()
}

void PostfixExpression() :
{}
{
PrimaryExpression() [ "++" | "--" ]
}

void PrimaryExpression() :
{}
{
PrimaryPrefix() ( PrimarySuffix() )*
}

void PrimaryPrefix() :
{}
{
Literal()
|
"(" Expression() ")"
|
AllocationExpression()
|
Name()
}

void PrimarySuffix() :
{}
{
"[" Expression() "]"
|
LOOKAHEAD(2)
"." "addStack" "(" ( Name() | Literal() ) ")"
|
"." "ordStack" "(" OrdenType() ")"

}

void OrdenType() :
{}
{
"ascendente"
|
"descendente"
}

void Literal() :
{}
{
< INTEGER_LITERAL >
|
< FLOATING_POINT_LITERAL >
|
< CHARACTER_LITERAL >
|
< STRING_LITERAL >
|
BooleanLiteral()
}

void BooleanLiteral() :
{}
{
"true"
|
"false"
}

void AllocationExpression() :
{}
{
"new" PrimitiveType() ArrayDimsAndInits()
|
MakeStack()
}

void MakeStack() :
{}
{
"make" "stack"
}

void ArrayDimsAndInits() :
{}
{
LOOKAHEAD(2)
( LOOKAHEAD(2) "[" Expression() "]" )+ ( LOOKAHEAD(2) "[" "]" )*
|
( "[" "]" )+ ArrayInitializer()
}

void Statement() :
{}
{
Expression() ";"
|
RepeatStatement()

}

void RepeatStatement() :
{}
{
"repeat" Statement() "until" "(" Expression() ")"

}

Sunday, November 05, 2006

Stevey en el pais de las maravillas (Google)

Interesante artculo de Stevey para decirnos que vivimos en un mundo de mentira :) que sincero, y de como se debe trabajar segun Google.

Los 10 lenguajes más demandados

En este artículo se confirma mas aun lo que dije anteriormente, para mis amigos que todavia estan pensando que M$ domina el negocio de las computadoras no significa que contole en que se programa.

Sunday, August 27, 2006

oferta de trabajo USA

Esto es para los amigos mios que no creen que en el mundo de Java no se gana dinero (Eso es porque solamente piensa en dinero) y creen que los chelitos solo se hacen con M$.

Vean este sueldito.

Wednesday, August 16, 2006

The Power of Three - Eclipse, Tomcat, and Struts

Un pequeño tutorial de la integración de estos tres legendarios en el desarrollo de aplicaciones web de una manera ágil.

Branching with Eclipse and CVS

Un articulo para estar claro de como se manejan los branch en Eclipse con CVS.

http://www.eclipse.org/articles/Article-CVS-branching/eclipse_branch.html

Tuesday, August 15, 2006

Nifty Corners - Esquinas redondeadas

Como obterner cuadros con esquinas redondeadas, pero lo más importante compatible con los diferentes navegadores, solución usar Nifty Corners , es una librería ligerade css y javascript para lograr este efecto es bien fácil de usar en nuestros proyectos.

Ruby on Rails and J2EE

Este artículo es una comparacion de los modelos de desarrollo propuesto por Ruby on Rails y J2EE.

Mostrando cada ventaja y desventaja, un buen artículo con los pies sobre la tierra.

open source Java para octubre

En este artículo se expresa lo que mucho tal vez mucho han escuchado, pero esta vez no es solo un deseo o rumor, la plataforma Java se piensa librerar con una licencia compatible con el open source, lo cual si se haria seria un hito en la industria.

Esto incluye un compilador, un virtual machine, etc. al principio y todo este proceso tardará hasta el 2007 cuando toda la plataforma será librerada completamente.

Friday, August 11, 2006

EJB3 - Conceptos Basicos

En este artículo se trata de explicar cuáles son los distintos tipos de Enterprise Java Bean y cuáles son los propósitos de cada uno de ellos : Stateless Session Bean, Stateful Session Bean, Entity Bean y Message Driven Bean.

Cualquiera que quisiera entender el mundo del EJB este es un buen comienzo.

Spring AOP

Spring AOP


Un poco de orden en tus proyectos ;)

Spring AOP es útil para realizar tareas puntuales que no encajan de forma natural en nuestras entidades ni en nuestra lógica de negocio.

Este artículo muestra de manera básica como usarlo en nuestros proyectos.

Thursday, July 27, 2006

Curso de Ajax

El proposito de este curso aprender Ajax para el desarrollo de aplicaciones web en java.

Este cursos es importante (y gratis), porque se presentan las herramientas y frameworks más usados para la creación y utilizacion de ajax en nuestras aplicaciones. Osea que desde un simple javascript hasta GoogleWebToolKit, e incluso ajax en JSF. Para ser un cursos gratis es demasiado completo y variado. Ademas es stateless :D, osea que no es webcasting (no tiene un horario, para que todos puedan particapar con comodidad de horario), este curso incluye ppt, videos, flashes :) e incluso audio, tanto de teoria y practica.

AjaxCodeCamp

Favor leer las instrucciones del cursos. RTFM :)

Estos chicos se merecen su donación.

Oracle 10.2 sql

Una buena referencia de sentecias sql para Oracle 10.2.

artículo

Sunday, July 09, 2006

OK, Sudoku - TDD una practica de fin de semana

Este es un artículo de xprogramming.com, es interesante para practicar un poco de test driven development, este ejemplo se basa en la creación del novedoso juego sudoku. Y Happy coding...

http://www.xprogramming.com/xpmag/OkSudoku.htm

Tuesday, June 27, 2006

Thursday, June 22, 2006

how to change the address of the webservices in run time?

Solo hay que asignar un nuevo endpoint address.

xxxxxLocator loc = new xxxxxLocator();
loc.setEndpointAddress(servicePortName,the new URL (as a String))

Wednesday, June 21, 2006

Migrating to Eclipse: A developer's guide to evaluating Eclipse vs. IntelliJ IDEA

Un poco sobre porque migrar de IDEA a Eclipse, pero aunque se que a mucho lo le gusta esto, (todo esto de los ide es cuestion de gusto) pienso que las capacidades de uno u de otro, estan por encima del fanatismo por un determinado IDE.

En este artículo se analiza cada parte de eclipse y se le compara con IDEA.

Eclipse y Tomcat Integración

Este es un buen artículo sobre la integración de eclipse con tomcat para el desarrollo web, esto ayuda ha acelerar el desarrollo para realizar la depuraciones de código de manera más eficiente.

artículo

Monday, June 19, 2006

Una api para el Tiempo

joda time esta api es para sustitir la clase date, time y calendar. Que realmente no ayudan mucho.

La página: http://joda-time.sourceforge.net/

Tuesday, June 13, 2006

Bruce Eckel Interviews Software Luminaries

Entrevistando a los Peso PESADO ;) de la programación. Quien sepa quienes son los respetará a cada uno por su trabajo y aportes.

Yo mientras tanto, disfrutaré estas entrevistas.

http://www.mindviewinc.com/mediacast/interviews/Index.php

Google Web Toolkit

Google a la carga :D estos chicos no se duermen. Y M$ le sigue los pasos ( hablo de script#).
Para los que quieren programar ajax esto es una maravilla, porque resuelve problemas de la programación en ajax como la depuración del código.

QWT es realmente un traductor de java a javascript (a ajax ;) , es un conjunto de herramientas que permite trabajar comodamente desde java, con un api al estilo swing con equivalente a dialogbox, y muchos otros componentes gráficos, que trabajandolos con javascript se haria muy pero muy dificil y trabajoso de hacer y mantener.

Estos muchachos piensan en los demás y son buenos samaritanos ( si siii :) , por lo tanto comparten su tool con nosostros.

http://code.google.com

Monday, June 12, 2006

Como depurar aplicaciones web con Eclipse

En mi busqueda de como depurar una aplicación web encontre estos links que me ayudaron a elegir la forma en la que quiero depurar mis aplicaciones web.

http://www.jroller.com/page/gursesl/print/remote_application_debugging_with_weblogic

http://tomcat.apache.org/faq/development.html

http://www.laliluna.de/debugging-jsp-java-tutorial.html

http://javaboutique.internet.com/tutorials/three/index.html

Por supuesto elegi la ultima, porque programo en eclipse con tomcat y sysdeo para unirlos

Monday, June 05, 2006

Mi experiencia con Webwork y Hibernate

Comenzado con que fue larga por razones de preparación y educacion fuertemente autodidáctica en unas técnicas que eran nuevas para mi (y ciertamente para en el mundo de java también por lo que he visto) Pero hoy ya eso es diferente :) . Fue muy bueno porque pude comprobar que no es tan difícil después de todo. Lo más difícil fue entender algunos conceptos y patrones de diseño que se utilizan. Y cuando lo aprendes te das cuenta de que ciertamente es la manera más facil de hacer las cosas (es lo que realmente se quiere, no es así :-).

Este framework es recomendado para proyectos grandes y medianos, pero nunca para hacer aplicaciones burdas.

Luego en otro post hablaré de la ventajas de usar este framework.

Saturday, April 01, 2006

La mejor crítica a Java

He visto muchas personas criticando a Java en el Internet, pero todos estos comentario me parecían banales porque las razones que daban era totalmente sin fundamento, sin mencionar de se notaba la poco experiencia de programación con java que tenían (se veía solo con leer lo que decían :-).

Leí este artículo y me pareció estupendo, la persona que lo escribió si parece tener experiencia de programación en Java y no solo eso yo mismo he tenido alguno de los problemas mencionados y que he tenido que solucionar. A diferencia de muchos críticos, el no crítica la sintaxis en si sino el conjunto de api, frameworks y herramientas de desarrollo que se supone tienen que hacer la vida del programador un poco más fácil y productiva. La manera en que un programador de Java resuelve lo problemas día a día.

Por cierto los frameworks de desarrollo web están fuera por serian muy polémico el articulo, en realidad los frameworks web son para otros articulo aparte.


El artículo Dreaming in Java

Tuesday, March 28, 2006

WebServices con Java utilizando Axis

Para los que no lo han usado se lo recominedo, utilizar Axis es un placer.

Para tener una idea de como funciona les recomiendo leerse el tutorial de la pagina oficial, y si eres como yo "fast", entonces ahi una presentacion tutorial en HP muy completo de desarrollo agil.

http://ws.apache.org/axis/

Tutorial de HP

Saturday, January 21, 2006

Apple el renacido competidor de Micro$oft



Todos saben la noticia de que apple vale > Dell, dicho por el propio Steve Jobs, bueno el problema es que Apple tambien se mudo a procesadores intel los cual quiere decir que COMPETIRA más directamente en el mercado contra M$ y no solo eso el valor de las acciones de Apple son ya > que las de M$.

Sun no se atras y Google ni se diga ;-).

Ha de esperarse muchas cosa de esta compañia este año. Y de las otras tambien ;-)

AAPL $ 79.035 3.4551 4.19% 60,585,718 NASDAQ-NM
MSFT $ 27.02 0.19 0.71% 60,382,450 NASDAQ-NM

JXTA P2P en Java

Teórico y lo más importante práctico tambien ;-) muestra como hacer un Hello JXTA!
http://www.onjava.com/pub/a/onjava/2001/04/25/jxta.html?page=1

Muy teórico pero importante sobre la arquitectura
http://www.javaworld.com/javaworld/jw-10-2001/jw-1019-jxta.html

Una pagina a tener en cuenta: http://www.jxta.org/

JXTA es un protocolo de P2P desarrollado por Sun y luego liberado como open source que se a convertido en estandar para la industria.

Friday, January 20, 2006

how to attach a MaskFormatter to a JFormattedTextField in the IDE's form editor?

Un pequeño tutorial de como manejar validaciones con java Studio Entreprise, puesto que me fue un poco trabajoso tuve que preguntarle al soporte como se hacia, y realmente es sencillo pero muy elaborado. Esta en ingles espero que se entienda ;-)

how to attach a MaskFormatter to a JFormattedTextField in the IDE's form editor?

1. Add JFormattedTextField to the form.

2. In Properties window, click ... button for formatterFactory property.

3. Select User Code radio button.

4. Enter the following example text into the text area:



new javax.swing.JFormattedTextField.AbstractFormatterFactory() {

public javax.swing.JFormattedTextField.AbstractFormatter

getFormatter(javax.swing.JFormattedTextField tf) {

try {

return new javax.swing.text.MaskFormatter("##-###");

} catch (java.text.ParseException pe) {

pe.printStackTrace();

}

return null;

}

}



5. Build and run the project and you've got a formatted text field that only accepts two digits, a hyphen, and three more digits (the hyphen is automatically inserted by the formatter).



--> On the other hand, are you asking how to validate the input when the form in which the formatted text field is contained is somehow dismissed (e.g. if the field were in a dialog In that case, the code which built and displayed the dialog will need an action listener on the button which accepts the user input, and this listener will retrieve the text from the field, validate it, and if it is incorrect, either display a message in a new dialog, or show an error message in a JLabel near the bottom or top of the dialog (commonly seen in Studio itself). If the input is valid, then dispose of (i.e. close) the original dialog and proceed as normal with the given user input.


--> Or, do you want to verify the input before the field loses focus? In that case, click the ... button next to the inputVerified property for the text field and add something like the following for the User Code:


new javax.swing.InputVerifier() {

public boolean verify(javax.swing.JComponent input) {

// validate user input

return true;

}

}

The code displaying the input dialog would need a counter, incremented each time the input was invalid, and show the error dialog only on the third attempt.


En forma de Bean

import java.awt.event.FocusListener;

import javax.swing.JFormattedTextField;
import javax.swing.text.MaskFormatter;

public class MaskFormattedTextField extends JFormattedTextField
implements java.io.Serializable {
private String mask = "";

public MaskFormattedTextField() {
addFocusListener(new FocusListener() {
public void focusGained(java.awt.event.FocusEvent e) {
selectAll();
}
public void focusLost(java.awt.event.FocusEvent e) {}
});
}

public final String getMask() {
return mask;
}

public final void setMask(final String m) {
mask = m;

try {
new MaskFormatter(mask).install(this);
} catch (java.text.ParseException e) {
e.printStackTrace();
}
}
}

Wednesday, January 11, 2006

Asp.NET vs JSF

Una interesante comparativa de las dos tecnologias:

http://www.developer.com/net/asp/article.php/10917_3572721_1

Esto es para los amigos mios, para que esten claros en las diferencias que hay entre programar con asp.NET y JSF ( .NET Y JAVA como ustedes le llaman :-)

Es un buen analisis y toca todos los puntos en el desarrollo de un programa con las dos tecnologias.