Skip to end of metadata
Go to start of metadata

You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 9 Next »

AST operators

Code gen templates for operators; assume root=null (not nil), kids=_adaptor.createChildList()

grammar fragment

code

A

kids.add(_adaptor.create($A));
if ( root==null && kids.size()>0 ) root = _adaptor.nil();
_adaptor.addChildren(root, kids); // A
_localctx.tree = root;

A B

kids.add(_adaptor.create($A));
kids.add(_adaptor.create($B));
if ( root==null && kids.size()>0 ) root = _adaptor.nil();
_adaptor.addChildren(root, kids); // ^(nil A B)
_localctx.tree = root;

A^ B

root = root==null ? $A : _adaptor.becomeRoot(root, $A, kids);
kids.add(_adaptor.create($B));
if ( root==null && kids.size()>0 ) root = _adaptor.nil();
_adaptor.addChildren(root, kids); // ^(A B)
_localctx.tree = root;

A B^

kids.add(_adaptor.create($A));
root = root==null ? $B : _adaptor.becomeRoot(root, $B, kids);
if ( root==null && kids.size()>0 ) root = _adaptor.nil();
_adaptor.addChildren(root, kids); // ^(B A)
_localctx.tree = root;

A B^ C

kids.add(_adaptor.create($A));
root = root==null ? $B : _adaptor.becomeRoot(root, $B, kids);
kids.add(_adaptor.create($C));
if ( root==null && kids.size()>0 ) root = _adaptor.nil();
_adaptor.addChildren(root, kids); // ^(B A C)
_localctx.tree = root;

A B^ C^ D

kids.add(_adaptor.create($A));
root = root==null ? $B : _adaptor.becomeRoot(root, $B, kids);
root = root==null ? $C : _adaptor.becomeRoot(root, $C, kids);
kids.add(_adaptor.create($D));
if ( root==null && kids.size()>0 ) root = _adaptor.nil();
_adaptor.create(root, kids); // ^(C ^(B A) D)
_localctx.tree = root;

a^ b

root = root==null ? $a.tree : _adaptor.becomeRoot(root, $a.tree, kids);
kids.add($b);
if ( root==null && kids.size()>0 ) root = _adaptor.nil();
_adaptor.addChildren(root, kids); // ^(A B)
_localctx.tree = root;

Rewrites

Code gen templates for rewrite rules; assume root=_adaptor.nil(), kids is _adaptor.createChildList(). assume we can't distinguish statically single vs multi-valued elements from left of -> for now.

grammar fragment

code

A -> A

A_it = A_list.iterator(); // iterator of tokens
kids.add(A_it.next());    // let _adaptor.add() create appropriate node
_localctx.tree = _adaptor.create(null, kids); // A

A -> A A

A_it = A_list.iterator();
kids.add(A_it.next());
kids.add(A_it.next()); // iterator keeps returning A nodes
_localctx.tree = _adaptor.create(root, kids); // ^(nil A A)

A+ -> A A

A_it = A_list.iterator();
kids.add(A_it.next());
kids.add(A_it.next()); // iterator keeps returning A nodes
_localctx.tree = _adaptor.create(root, kids); // ^(nil A A)

A B -> ^(A B)

root = _adaptor.create(A_it.next());
kids.add(_adaptor.create($B));
_localctx.tree = _adaptor.create(root, kids); // ^(nil A A)

A+ -> A*

A_it = A_list.iterator();
while (A_it.hasNext()) {
    kids.add(_adaptor.create(A_it.next()));
}
_localctx.tree = _adaptor.create(root, kids); // ^(nil A A ... A)

B A+ -> ^(B A*)

A_it = A_list.iterator();
B_it = B_list.iterator();
root = _adaptor.create(B_it.next());
while (A_it.hasNext()) {
    kids.add(_adaptor.create(A_it.next()));
}
_localctx.tree = _adaptor.create(root, kids); // ^(B A A ... A)

A+ -> ^(B A)*

A_it = A_list.iterator();
root_1 = null;
while (A_it.hasNext()) {
    root_1 = _adaptor.create(_adaptor.create(B, "B")); // imaginary B root
    kids_1.add(_adaptor.create(A_it.next()));
    kids.add( _adaptor.create(root_1, kids_1) ); // ^(B A)
}
_localctx.tree = _adaptor.create(root, kids); // ^(nil ^(B A) ^(B A) ...)
  • No labels