Aiui Eclipse JDT (and probably other IDEs too) do something similar. It takes code that currently is not valid and tries to massage the AST until it becomes valid so that it can perform type-inference and use the type information to offer valid autocomplete suggestions even at the currently invalid location.
Yes, a few IDEs perform some disambiguation during parse. But notice that the ability to deal with ambiguities and to come up with a proper AST is just step 0 of the pipeline. The challenging part is type inference - as far as I know there are no other tools that can reconstruct sources as we do.
It builds the set of type and other constraints that must be fulfilled for the program to be valid.
It uses a constraint solver to solve the set of constraints and generate a program that satisfies them.
IE For "List list" to work, there must be a thing named List available as a typedef.
For list = 0 to work, tlist must be a pointer or an int.
For list->data to work, list must be a pointer to a struct, and that struct must have a member named data.
for list->data = val to work, the member named data must be compatible with a double.
It simply generates all of the constraints like this on the program, and then solves the constraint set, which produces a valid program (hopefully. it is possible it may not have enough data in some cases, given how C is parsed)
Exactly. Some programs are inherently ambiguous. In such cases, we cannot do much.
- Example 1: `void f(){x * y;}`
It's impossible to know whether that is a multiplication or pointer declaration.
- Example 2: `void f(){x y = 0;}`
We can only know that x is a scalar type (in C terminology), but it could be an int, int * , int * * , etc.
Besides, if you want correct code, don't ask a tool to guess it! This tool is for patching up fragments enough to get them through the compiler front end analysis.
Indeed, this can be an arguable choice. But notice the project is still in research, it's not an end-user product yet. Eventually, we'll offer options so the user can specifier whether he/she wants such a thing (or inference of standard/posix library functions, for example).
You're right, it's not always used. Please notice my other answer above, the project is still a prototype. Eventually, we'll filter what actually goes to the generated header and we'll allow the user to specify whether he/she wants bools, inference of C/POSIX library functions, etc.