[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