Se ho capito bene i numeri possono essere di una sola cifra.
La grammatica che genera il linguaggio da te dato è:
E->(NON)|EOE
N->0|1|2|3|4|5|6|7|8|9|
O->+|-|/|*
che per l'analisi LL(1) diventa:
E->(NON)E1
E1->OEE1|epsilon
N->0|1|2|3|4|5|6|7|8|9|
O->+|-|/|*
Da qui è facile creare il parser creando un metodo per ogni simbolo non terminale ed inserendo dove serve il salvataggio del simbolo nella struttura dati, ad esempio per E:
private static void E() throws ErroreRiconoscimento{
if( lex.currentSymb()=='(' ) {
lex.nextSymb();
N();O();N();
lex.accept( ')' );
E1();}
else throw new ErroreRiconoscimento();}
Poi nei metodi di N() ed O() puoi inserire una stringa che alla lettura del numero o operatore lo aggiunga alla struttura dati:
private static void N() throws ErroreRiconoscimento{
if(lex.currSymb()==0||lex.currSymb()==1||........)
vettore.push(lex.currentSymb());
lex.nextSymb();
else throws new ErroreRiconoscimento();}
lex è una istanza dell' analizzatore lessicale che ha in input la strnga da analizzare e vettore è una struttura dati per salvare numeri ed operandi.
Spero d'essere stato utile e chiaro(....spero anche preciso è da tanto che non scrivo parser)
ciao