[antlr-interest] How to catch error message.

Jun Tsai jun.tsai at gmail.com
Sun Mar 12 17:42:03 PST 2006


hi all,
  In my grammer,I find some error message not excpetion was thrown.How to
catch the exception.
Such as I have a grammer to count the chemistry formula. When I input
"Na(OH" ,no exception was thrown,But I find some error message in
console.How to catche the message?

====Code ===
header {
package poison.antlr;
import java.io.StringReader;
import java.util.HashMap;
import java.util.TreeSet;
import java.util.TreeMap;
import java.util.Comparator;
import java.util.List;
import java.util.Arrays;
}
/**
 * Convert Chemical Forumal.
 * Co3-H5-Al8  => H5Al8Co3
 * Al3(AlH3)3Al => H9Al7
 * Al3-(AlH3)3Al => H9Al7
 * Al3(AlH3)3Al.4H2Al => H17Al11
*  Thank Jbb
 * @author Jun Tsai
 */
class ChemicalsParser extends Parser;
{
    public static String getFormulaMerged(String str) throws
RecognitionException, TokenStreamException{
        final ChemicalsLexer lexer =  new ChemicalsLexer(new
StringReader(str));
        final ChemicalsParser parser =  new ChemicalsParser(lexer);

        return parser.entry().getFormulaMerged();
    }
    public static void main(String [] args) {
        final String [] inputs=  {
            "(Co4)3C24-H72-(H2Co2)2Co-N12-O9-P62Cl",        // >
C24Cl1Co17H76N12O9P62
            "(Co4)3C24-H72-(H2Co2)2Co-N12-O9-P62Cl.5Cl8F9",        // >
C24Cl41Co17F45H76N12O9P62
            "Co3-H5-Al8",       // > Al8Co3H5
            "Al3(AlH3)3Al", //   H9Al7
            "Al3-(AlH3)3Al", // H9Al7
            "Al3(AlH3)3Al.4H2Al" //H17Al11
        };

        for (String s : inputs) {
            try {
                System.out.format("about to parse: `%s` ", s);
                final ChemicalsLexer lexer =  new ChemicalsLexer(new
StringReader(s));
                final ChemicalsParser parser =  new ChemicalsParser(lexer);

                parser.entry().print();

            } catch( Exception e ) {
                e.printStackTrace();
            }
        }

    }
    /**
    * Periodic Table
    */
    public static final class Table extends TreeMap<PeriodicElement,Integer>
{

        public final void print() {

            System.out.println(getFormulaMerged());
        }
        public final String getFormulaMerged(){
            TreeSet<PeriodicElement> sorted_Keys =  new
TreeSet<PeriodicElement>(keySet());
            StringBuffer sb=new StringBuffer();
            for (PeriodicElement key : sorted_Keys) {
                sb.append(String.format("%s%s", key.getName(),get(key)));
            }
            return sb.toString();
        }
        public final int getMolecularWeight(){
            TreeSet<PeriodicElement> sorted_Keys =  new
TreeSet<PeriodicElement>(keySet());
            int weight=0;
            for (PeriodicElement key : sorted_Keys) {
                System.out.println("key:"+key.getValue());
                weight+=key.getValue();
            }
            return weight;
        }

        public final void merge(Table m) {
            for (PeriodicElement key : m.keySet()) {
                final int v=  m.get(key);
                if (containsKey(key)) {
                    int old = get(key);
                    put(key, old + v);
                } else {
                    put(key,v);
                }
            }
        }

        public final void update(int n) {
            for (PeriodicElement key : keySet()) {
                final int v = get(key);
                put(key, n * v);
            }
        }

    }
     private static final class PeriodicElement implements
            Comparable<PeriodicElement> {
        private String name;

        private int value;

        public static final List<String> list = Arrays.asList(new String[] {
                "H", "He", "Li", "Be", "B", "C", "N", "O", "F", "Ne", "Na",
                "Mg", "Al", "Si", "P", "S", "Cl", "Ar", "K", "Ca", "Sc",
"Ti",
                "V", "Cr", "Mn", "Fe", "Co", "Ni", "Cu", "Zn", "Ga", "Ge",
                "As", "Se", "Br", "Kr", "Rb", "Sr", "Y", "Zr", "Nb", "Mo",
                "Tc", "Ru", "Rh", "Pd", "Ag", "Cd", "In", "Sn", "Sb", "Te",
                "I", "Xe", "Cs", "Ba", "La", "Ce", "Pr", "Nd", "Pm", "Sm",
                "Eu", "Gd", "Tb", "Dy", "Ho", "Er", "Tm", "Yb", "Lu", "Hf",
                "Ta", "W", "Re", "Os", "Ir", "Pt", "Au", "Hg", "Tl", "Pb",
                "Bi", "Po", "At", "Rn", "Fr", "Ra", "Ac", "Th", "Pa", "U",
                "Np", "Pu", "Am", "Cm", "Bk", "Cf", "Es", "Fm", "Md", "No",
                "Lr", "Rf", "Db", "Sg", "Bh", "Hs", "Mt" });

        public PeriodicElement(String name) {
            this.name = name;
            this.value=list.indexOf(name)+1;
        }

        public String getName() {
            return name;
        }
        public int getValue(){
            return this.value;
        }
        public int compareTo(PeriodicElement o) {

            return this.value - o.value;
        }

        @Override
        public boolean equals(Object obj) {
            if(obj instanceof PeriodicElement){
                return this.value == (((PeriodicElement) obj).getValue());
            }else{
                return false;
            }
        }

    }


}

entry returns [ Table e = null; ] :
        e=expression EOF
        ;
expression returns [ Table v = null ] :
       v=term
         ( { final int c; final Table t; }
           DOT c=count t=term
           { t.update(c); v.merge(t); }
         )*
   ;
term returns [ Table v =  new Table() ] :
        ( { final Table a; } a=atom { v.merge(a); } )+
    ;

atom returns [ Table v = null ] :
          ( { final int n2; }
            LPAREN v=expression RPAREN n2=count
            { v.update(n2); }
        )
        |
        ( { final String b; final int n1; }
            b=base n1=count
            { v =  new Table(); v.put(new PeriodicElement(b),n1); }
        )

    ;

base returns [ String c= null ] : x:CHAR { c =  x.getText(); } ;

count returns [ int v = 1 ] :
        ( n:NUM { v=Integer.parseInt(n.getText()); } )?
    ;

/**
 *
 * @author Jun Tsai
 */
class ChemicalsLexer extends Lexer;
options { k=2;}
CHAR :
"H"|"He"|"Li"|"Be"|"B"|"C"|"N"|"O"|"F"|"Ne"|"Na"|"Mg"|"Al"|"Si"|"P"|"S"|"Cl"|"Ar"|"K"|"Ca"|"Sc"|"Ti"|"V"


|"Cr"|"Mn"|"Fe"|"Co"|"Ni"|"Cu"|"Zn"|"Ga"|"Ge"|"As"|"Se"|"Br"|"Kr"|

"Rb"|"Sr"|"Y"|"Zr"|"Nb"|"Mo"|"Tc"|"Ru"|"Rh"|"Pd"|"Ag"|"Cd"|"In"|"Sn"|"Sb"|"Te"|"I"|"Xe"|


"Cs"|"Ba"|"La"|"Ce"|"Pr"|"Nd"|"Pm"|"Sm"|"Eu"|"Gd"|"Tb"|"Dy"|"Ho"|"Er"|"Tm"|"Yb"|"Lu"|"Hf"|


"Ta"|"W"|"Re"|"Os"|"Ir"|"Pt"|"Au"|"Hg"|"Tl"|"Pb"|"Bi"|"Po"|"At"|"Rn"|

"Fr"|"Ra"|"Ac"|"Th"|"Pa"|"U"|"Np"|"Pu"|"Am"|"Cm"|"Bk"|"Cf"|"Es"|"Fm"|"Md"|"No"|"Lr"|"Rf"|"Db"|"Sg"|"Bh"|"Hs"|"Mt";


protected DIGIT : '0'..'9' ;
NUM : ( DIGIT )+ ;
DOT:'.';
LPAREN : '(' ;
RPAREN : ')' ;
WS     :
    (' '
    | '\t'
    |'-'
    | '\r' '\n' { newline(); }
    | '\n'      { newline(); }
    )
    { $setType(Token.SKIP); }
  ;


====End ===

--
Welcome to China Java Users Group(CNJUG).
http://cnjug.dev.java.net
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://www.antlr.org/pipermail/antlr-interest/attachments/20060313/44f82b26/attachment-0001.html


More information about the antlr-interest mailing list