[antlr-interest] Re: matching an AST segment with Java 5

John Green greenj at ix.netcom.com
Wed Jul 26 09:59:04 PDT 2006


Whoops, that's really incomplete. I hit send too soon. How embarrassing. Need more coffee. Please delete my last post and pretend you didn't see it.  :-/

John Green wrote:
> John Green wrote:
>>     // Looking for: #(PLUS #(PLUS NUMBER NUMBER) NUMBER)
>>     // and if found, print the text of the first NUMBER node.
>>     Object [] match = match(currentNode,
>>         new Object[]{PLUS, new Object[]{PLUS, NUMBER, NUMBER}, NUMBER}
>>         );
> 
> 
> Filling in the code for match() was easy. Here's a quick test mTest(), 
> which calls a sample usage m(), which calls match().
> 
> 
> private static final int PLUS = 20;
> private static final int NUMBER = 30;
> void mTest() {
>     AST p1 = new CommonAST(); p1.setType(PLUS);
>     AST p2 = new CommonAST(); p2.setType(PLUS);
>     AST n1 = new CommonAST(); n1.setType(NUMBER); n1.setText("1");
>     AST n2 = new CommonAST(); n2.setType(NUMBER); n2.setText("2");
>     AST n3 = new CommonAST(); n3.setType(NUMBER); n3.setText("3");
>     p1.setFirstChild(p2);
>     p2.setFirstChild(n1);
>     n1.setNextSibling(n2);
>     p2.setNextSibling(n3);
>     m(p1);
> }
> 
> void m(AST currentNode) {
>     // Looking for: #(PLUS #(PLUS NUMBER NUMBER) NUMBER)
>     // and if found, print the text of the first NUMBER node.
>     Object [] match = match(
>             currentNode
>             , new Object[]{PLUS, new Object[]{PLUS, NUMBER, NUMBER}, 
> NUMBER}
>             );
>     if (match!=null) {
>         System.out.println(((AST)((Object[])match[1])[1]).getText());
>     } else {
>         System.out.println("No match");
>     }
> }
> 
> Object[] match(AST ast, Object[] objarray) {
>     if (ast==null) return null;
>     Object[] ret = new Object[objarray.length];
>     ret[0] = ast;
>     AST currAST = ast.getFirstChild();
>     for (int count = 1; count < objarray.length; count++) {
>         if (currAST==null) return null;
>         if (objarray[count] instanceof Object[]) {
>             Object[] nonterminal = match(currAST, 
> (Object[])objarray[count]);
>             if (nonterminal==null) return null;
>             ret[count] = nonterminal;
>         } else {
>             ret[count] = currAST;
>         }
>         currAST = currAST.getNextSibling();
>     }
>     return ret;
> }
> 
> 
> 
> 
> 
> John Green wrote:
>> With Java 5 and autoboxing, I could use nested Object arrays as a 
>> quick and dirty description for a segment of an AST. Has anybody done 
>> this sort of thing before? Specifically, I wonder if match(AST, 
>> Object[]) as per my "usage example" below has been written and exists 
>> in any of the Antlr or other libraries.
>>
>> It'll be easy to write, I'd just rather use existing libraries.  :)
>> <snip>
>>
>> Cheers,
>> John
>> www.joanju.com
>>
> 


More information about the antlr-interest mailing list