[cfe-dev] TreeTransform and Clang

Vassil Vassilev vasil.georgiev.vasilev at cern.ch
Sun Aug 8 09:11:51 PDT 2010


On Sat, 2010-08-07 at 21:58 +0200, Douglas Gregor wrote:
> On Aug 7, 2010, at 6:19 PM, Vassil Vassilev wrote:
> 
> > On Sat, 2010-08-07 at 13:47 +0200, Douglas Gregor wrote:
> >> On Aug 7, 2010, at 9:28 AM, Vassil Vassilev wrote:
> >> 
> >>> Hello,
> >>> Hm, Is the error handling in the semantic analysis, too?
> >> 
> >> Yes.
> >> 
> >>> I need the following
> >>> For example (I am skipping the pointers and other ugly things that
> >>> made it less readable):
> >>> 
> >>> funtion F(int x, float y,string z) {
> >>>    int i = objX.GetValue(x);  //compile time object and method
> >>> invocation
> >>>    TFile t = new TFile("MyFile.hhh");  //here goes the interpreter,but
> >>> it needs addresses of the variables from the compiler
> >>>    i = t.DoSomething(i, x, y, z);
> >>>    Console.WriteLine(i.ToString());
> >>> }
> >>> 
> >>> Here the semantic analyzer should say undeclared variable and so on. 
> >> 
> >> Yes, it will.
> >> 
> >>> Before that happens I want to change the AST and to convert it in something like:
> >>> 
> >>> funtion F(int x, float y,string z) {      
> >>>    int i = objX->GetValue(x);  //compile time object and method invocation      
> >>>    TFile t = new TFile("MyFile.hhh");  //here goes the interpreter,but it needs addresses of the variables from the compiler      
> >>>    Context c = new Context();
> >>>    c.AddVariable(i.GetDeclaration()) ; //here we should use some kind of  reflection or we can insert just the variable address and the proper mapping.   
> >>>    c.AddArgument(x.GetDeclaration());
> >>>    ...
> >>>    Interpreter.Interpret("t->DoSomething(i,x,y,z)", c);
> >>>    i = t.DoSomething(i, x, y, z);
> >>>    Console.WriteLine(i.ToString());   
> >>> } 
> >>> 
> >>> I know I can modify the Sema and/or put something in the symbol table
> >>> to achieve the goal but I am looking for more elegant solution.
> >> 
> >> The right way to do this would be to augment Sema's name-lookup facilities, so that your application gets a chance to provide symbols when no other symbols of the same name work. One way to do this is to create your own ExternalASTSource, and override FindExternalVisibleDeclsByName to add those symbols. If I remember correctly, LLDB does this.
> > I understand. But I want only to replace one node of the AST with
> > another. I don't need to exchange external symbol names and so on (at
> > least for now). Is it possible to hook somewhere before the error
> > handling and substitute the ExpressionStatement (i = t.DoSomething(i, x,
> > y, z);) With new BlockStatement or several ExpressionStatements.
> 
> You might be able to hack Sema to do this, but I don't see any clean way to do it.
So I guess I have to find where it handles the unknown symbol references
and then extend the logic, right?
> 
> > Or in
> > case of error AST is not built (which is strange for me because it
> > wouldn't be flexible for complex transformations...).
> 
> Complex transformations generally can't be performed correctly unless you start with correct inputs. Otherwise, how would you know that you've generated the correct output?
Yes you are right but I don't know why there is no generation of parse
tree which is correct according to the grammar and then to be passed for
semantic validation. 
I think that is the easiest way to extend the semantics of the custom
llvm modifications as in my case. 
For example the project I am working on needs advanced context
information (if there is statement like "TFile f = new
TFile(OpenDialog.Execute(Opendialog.Filename));") then it is possible to
have someobj.SomeMethod(SomeParams))
If I had a parse tree I would transform it easily, because I know the
exact semantics of what I am trying to achieve. Actually I will make one
semantic validation pass before the actual one. I need the parse tree
and after that I will describe what is the semantics of it.
According to me, if we had distinction between these to phases syntax
and semantic analysis we can improve the user-side semantics.
Syntax -> AST; CustomTransform1 -> AST, CustomTransform1 -> AST,
CustomTransform1->AST;Semantics -> AST;
The main advantage of that would be that if it doesn't pass the actual
semantic validation it will fail and the code generator will be still
the same.
I don't know if my idea is clear enough. But if you are interested I can
describe it more ... 
> 
> 	- Doug





More information about the cfe-dev mailing list