KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > tests > jfun > parsec > ParserTestCase


1 /*
2  * Created on 2004-11-13
3  *
4  * Author Ben Yu
5  */

6 package tests.jfun.parsec;
7
8 //import jfun.parsec.scanner.Scanner;
9
//import jfun.parsec.scanner.Scanners;
10
//import jfun.parsec.scanner.ParserException;
11
//import jfun.parsec.scanner.Lexers;
12
import jfun.parsec.*;
13 import junit.framework.Test;
14 import junit.framework.TestCase;
15 import junit.framework.TestSuite;
16 import jfun.parsec.FromLong;
17 import jfun.parsec.OperatorTable;
18 import jfun.parsec.Expressions;
19
20 /**
21  * @author Ben Yu
22  *
23  * 2004-11-13
24  */

25
26 public final class ParserTestCase extends TestCase {
27   private static Object JavaDoc parse(final String JavaDoc src, final Parser lexer,
28       final Parser p){
29     return Parsers.runParser(src, Parsers.parseTokens(lexer, p, "TestParser"),
30         new DefaultPositionMap(src, 1, 1), "TestParser");
31   }
32   private static void testGood(final String JavaDoc str, final long v){
33     final Parser p = getParser();
34     final Object JavaDoc r = parse(str, lexer1(), p);
35     assertEquals(new Long JavaDoc(v), r);
36   }
37   private static String JavaDoc testBad(final String JavaDoc str){
38     try{
39       parse(str, lexer1(), getParser());
40       throw new IllegalStateException JavaDoc("should have failed!");
41     }
42     catch(ParserException e){
43       return e.getMessage();
44     }
45   }
46   private static final Terms words = Terms.getOperatorsInstance(new String JavaDoc[]{
47       "+", "-", "*", "/", "(", ")" ,"."
48      });
49   private static final Parser lazy_expr = Parsers.lazy("lazy_expr", new ParserEval(){
50     public Parser eval(){
51       return expr();
52     }
53   });
54   private static Parser lexer1(){
55     return Lexers.lexeme(Scanners.javaDelimiter(), Parsers.plus(Lexers.lexLong(), words.getLexer()));
56   }
57   private static Parser op(final String JavaDoc n, final Map2 m2){
58     return words.getParser(n).seq(Parsers.retn(m2));
59   }
60   private static Parser op(final String JavaDoc n, final Map m){
61     return words.getParser(n).seq(Parsers.retn(m));
62   }
63   private static final Parser term = Parsers.plus(
64       Parsers.between(
65           words.getParser("("),
66           words.getParser(")"),
67           lazy_expr
68           ),
69       Terms.integerParser(new FromLong(){
70         public Object JavaDoc fromLong(int from, int len, final long l){
71           return new Long JavaDoc(l);
72         }
73       })
74   );
75   private static final Map negate = new Map(){
76     public Object JavaDoc map(final Object JavaDoc o){
77       return new Long JavaDoc(-((Number JavaDoc)o).longValue());
78     }
79   };
80   private static final Map2 add = new Map2(){
81     public Object JavaDoc map(final Object JavaDoc a, final Object JavaDoc b){
82       final Number JavaDoc l1 = (Number JavaDoc)a;
83       final Number JavaDoc l2 = (Number JavaDoc)b;
84       return new Long JavaDoc(l1.longValue()+l2.longValue());
85     }
86   };
87   private static final Map2 sub = new Map2(){
88       public Object JavaDoc map(final Object JavaDoc a, final Object JavaDoc b){
89         final Number JavaDoc l1 = (Number JavaDoc)a;
90         final Number JavaDoc l2 = (Number JavaDoc)b;
91         return new Long JavaDoc(l1.longValue()-l2.longValue());
92       }
93     };
94   private static final Map2 mul = new Map2(){
95     public Object JavaDoc map(final Object JavaDoc a, final Object JavaDoc b){
96       final Number JavaDoc l1 = (Number JavaDoc)a;
97       final Number JavaDoc l2 = (Number JavaDoc)b;
98       return new Long JavaDoc(l1.longValue()*l2.longValue());
99     }
100   };
101   private static final Map2 div = new Map2(){
102       public Object JavaDoc map(final Object JavaDoc a, final Object JavaDoc b){
103         final Number JavaDoc l1 = (Number JavaDoc)a;
104         final Number JavaDoc l2 = (Number JavaDoc)b;
105         return new Long JavaDoc(l1.longValue()/l2.longValue());
106       }
107     };
108
109
110   private static Parser expr(){
111     final OperatorTable ops = new OperatorTable();
112     ops.prefix(op("+", Maps.id()), 50)
113     .prefix(op("-", negate), 50)
114     .infixl(op("+", add), 30)
115     .infixl(op("-", sub), 30)
116     .infixl(op("*", mul), 40)
117     .infixl(op("/", div), 40);
118     return Expressions.buildExpressionParser("expr", term, ops);
119   }
120   /*
121   private static Parser expr(){
122     final Parser op_plus = op(words.getParser("+"), new Map2(){
123         public Object map(final Object a, final Object b){
124           final Number l1 = (Number)a;
125           final Number l2 = (Number)b;
126           return new Long(l1.longValue()+l2.longValue());
127         }
128       });
129     final Parser op_minus = op(words.getParser("-"), new Map2(){
130         public Object map(final Object a, final Object b){
131           final Number l1 = (Number)a;
132           final Number l2 = (Number)b;
133           return new Long(l1.longValue()-l2.longValue());
134         }
135       });
136     final Parser op_mul = op(words.getParser("*"), new Map2(){
137       public Object map(final Object a, final Object b){
138         final Number l1 = (Number)a;
139         final Number l2 = (Number)b;
140         return new Long(l1.longValue()*l2.longValue());
141       }
142     });
143     final Parser op_div = op(words.getParser("/"), new Map2(){
144         public Object map(final Object a, final Object b){
145           final Number l1 = (Number)a;
146           final Number l2 = (Number)b;
147           return new Long(l1.longValue()/l2.longValue());
148         }
149       });
150     final Parser addsub = Parsers.plus(op_plus, op_minus);
151     final Parser muldiv = Parsers.plus(op_mul, op_div);
152     final Parser emuldiv = Parsers.infixl(muldiv, signed());
153     final Parser eaddsub = Parsers.infixl(addsub, emuldiv);
154     return eaddsub;
155   };*/

156
157   public void test1(){
158     try{
159       testGood("1 + 2 ...", 3);
160     }
161     catch(ParserException e){
162       fail(e.getMessage());
163     }
164   }
165   public void test2(){
166     try{
167       testGood("1 + 2 * 3 ..", 7);
168     }
169     catch(ParserException e){
170       fail(e.getMessage());
171     }
172   }
173   public void test3(){
174     try{
175       testGood("//tesst\n (1 + /*ok*/ 2) * (5-4)", 3);
176     }
177     catch(ParserException e){
178       fail(e.getMessage());
179     }
180   }
181   public void test4(){
182     try{
183       testGood("//tesst\n (1 + /*ok*/ 2) * ((5/(4)+3))", 12);
184     }
185     catch(ParserException e){
186       e.printStackTrace(System.err);
187       fail(e.getMessage());
188     }
189   }
190   public void test5(){
191     try{
192       testGood("--1-+-+5 ", 6);
193     }
194     catch(ParserException e){
195       e.printStackTrace(System.err);
196       fail(e.getMessage());
197     }
198   }
199   public void testa(){
200     try{
201       System.out.println(testBad("1\t2 "));
202     }
203     catch(ParserException e){
204       e.printStackTrace(System.err);
205       fail(e.getMessage());
206     }
207   }
208   public void testb(){
209     try{
210       System.out.println(testBad("1.... "));
211     }
212     catch(ParserException e){
213       e.printStackTrace(System.err);
214       fail(e.getMessage());
215     }
216   }
217   private static Parser getParser(){
218     return expr().followedBy(words.getParser(".").some(3).seq(Parsers.eof()));
219   }
220
221
222
223   public static Test suite(){
224     return new TestSuite(ParserTestCase.class);
225   }
226   public static void main(String JavaDoc[] args){
227     junit.textui.TestRunner.run(suite());
228   }
229 }
230
Popular Tags