[cfe-dev] Dividing statements
Pedro Delgado Perez
pedro.delgadoperez at mail.uca.es
Sat Mar 1 08:52:21 PST 2014
Thank you all for your answers! I haven't realized in that possibility, but it is definitely what I was looking for.
Csaba, sorry for the way of expressing myself, but I wasn't entirely familiar with these terms, but now they are much clearer.
Thanks again,
Pedro.
El día 01 mar 2014 13:22, Csaba Raduly <rcsaba at gmail.com> escribió:
> Hi Pedro,
>
> On Thu, Feb 27, 2014 at 12:36 PM, Pedro Delgado Perez wrote:
>
>> Hi,
>>
>> I have a sentence like this:
>>
>> method( b ) , a = 3 , b++;
>>
>> This sentence is a statement composed of three substatements. What I need is
>> to difference those three substatements which are between commas to save
>> them in a list:
>>
>> Statement 1 -> method( b )
>> Statement 2-> a = 3
>> Statement 3 -> b++
>>
>> So I tried using the "child_iterator" in the class Stmt, which I though it
>> would be easy.
>> In the first iteration, the statement is subdivided in:
>>
>> [method( b ) , a = 3] and [b++;]
>>
>> The first sentence is then subdivided again in:
>>
>> [method( b )] and [a = 3]
>>
>> The problem is that I don't know when I should stop the division because,
>> now, the first statement is divided again to my surprise, taking the
>> argument "b" as a new statement. Thus, I'm getting more than three
>> statements, what is a major issue in my case.
>>
>> Is there any way to count the number of statements separated by commas?
>>
> "You keep using that word. I do not think it means what you think it means."
>
> In C++ the word "statement" has a precise meaning. There is no such
> thing in C++ as "substatement".
>
> Your "sentence" is _one_ statement. It contains an expression (whose
> result you're throwing away, but that's normal).
>
> There is no such thing as "statements separated by commas". There's
> not even "expressions separated by commas".
> You have been tricked by the fact that evaluation of comma expressions
> proceeds from left to right, into believing that the expression is
> represented as a linear data structure. It's not. It's a tree.
> Here's the output of clang -cc1 -ast-dump:
>
> `-BinaryOperator 0x6000c4d78 <line:9:3, col:47> 'int' ','
> |-BinaryOperator 0x6000c4d08 <col:3, col:31> 'int' ','
> | |-CallExpr 0x6000c4c50 <col:3, col:13> 'void'
> | | |-ImplicitCastExpr 0x6000c4c38 <col:3> 'void (*)(int)'
> <FunctionToPointerDecay>
> | | | `-DeclRefExpr 0x6000c4bc0 <col:3> 'void (int)' Function
> 0x60007e640 'method' 'void (int)'
> | | `-ImplicitCastExpr 0x6000c4c80 <col:11> 'int' <LValueToRValue>
> | | `-DeclRefExpr 0x6000c4be8 <col:11> 'int' lvalue Var
> 0x60007e8f0 'b' 'int'
> | `-BinaryOperator 0x6000c4ce0 <col:27, col:31> 'int' '='
> | |-DeclRefExpr 0x6000c4c98 <col:27> 'int' lvalue Var
> 0x60007e880 'a' 'int'
> | `-IntegerLiteral 0x6000c4cc0 <col:31> 'int' 3
> `-UnaryOperator 0x6000c4d58 <col:46, col:47> 'int' postfix '++'
> `-DeclRefExpr 0x6000c4d30 <col:46> 'int' lvalue Var
> 0x60007e8f0 'b' 'int'
>
> What you have is a binary expression: a comma operator and its two
> operands. One of the operands is a binary expression: a comma operator
> and its operands.
>
> You could perhaps try to navigate this tree and stop if the
> BinaryOperator is not a ',' .
>
>
> Csaba
> --
> GCS a+ e++ d- C++ ULS$ L+$ !E- W++ P+++$ w++$ tv+ b++ DI D++ 5++
> The Tao of math: The numbers you can count are not the real numbers.
> Life is complex, with real and imaginary parts.
> "Ok, it boots. Which means it must be bug-free and perfect. " -- Linus Torvalds
> "People disagree with me. I just ignore them." -- Linus Torvalds
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20140301/d28aa1d6/attachment.html>
More information about the cfe-dev
mailing list