[antlr-interest] How to serialize a AST

David Marín Carreño dmarin at sice.com
Tue Sep 15 00:30:02 PDT 2009


Hello all.

 

I am developing a calculation framework for my firm using ANTLR3 and Java.

 

I want to serialize an AST for reusing it a lot of times, so this way I can
save parsing time for each calculation.

 

I have developed a CommonTree derived class ICalcTree that implements
Serialize, and another class ICalcTreeAdaptor derived from
CommonTreeAdaptor.

 

In parser options, I have:

 

      output = AST;

      ASTLabelType = ICalcTree;

      language = Java;

 

The program uses the parser this way:

 

String formula = "a=1+2";

      

      Reader reader = new CharArrayReader(formula.toCharArray());

      ICalcLexer lexer = new ICalcLexer(new ANTLRReaderStream(reader));

      CommonTokenStream cts = new CommonTokenStream(lexer);

      ICalcParser tokenParser = new ICalcParser(cts);

        

      TreeAdaptor adaptor = new ICalcTreeAdaptor();

      tokenParser.setTreeAdaptor(adaptor);

      

      ICalcParser.formula_return parserResult =

            tokenParser.formula(); // start rule method

        

      reader.close();

      ICalcTree ast = (ICalcTree) parserResult.getTree();

            

      // Serialize

      

      ByteArrayOutputStream bs = new ByteArrayOutputStream();

      ObjectOutputStream os = new ObjectOutputStream(bs);

      os.writeObject(ast);

      os.close();

      

      byte[] buf = bs.toByteArray();

      String serialized = StringUtils.byteArrayToHexString(buf);

            

      

      // Unserialize

      

      byte[] buf_unserialized =
StringUtils.hexStringToByteArray(serialized);

      ByteArrayInputStream bi = new ByteArrayInputStream(buf_unserialized);

      ObjectInputStream ois = new ObjectInputStream(bi);

      try {

            ICalcTree new_ast = new ICalcTree();

            new_ast = (ICalcTree) ois.readObject();

            System.out.println(new_ast.toStringTree());

      } catch (ClassNotFoundException e) {

            e.printStackTrace();

      }

 

It always print nil, for whatever formula string. 

What am I doing wrong? How can I serialize the AST so it can be reused many
times?

 

Thank you for your assistance.

 

 

David Marín Carreño 

S.I.C.E. 

Dirección Técnica. 

Tfno 91 623 22 30

E-mail: dmarin at sice.com

 

 

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://www.antlr.org/pipermail/antlr-interest/attachments/20090915/fd9ef891/attachment.html 


More information about the antlr-interest mailing list