#2 is incorrect.  Being sensitive to line breaks does not make a grammar context-sensitive.  It just means you have to treat line breaks as tokens rather than ignorable whitespace (which is exactly what the context-free grammar given in the C11 standard does).<p>Same with the bit about concatenating tokens.  Every single one of those examples has a static parse tree, which, for the C <i>preprocessor</i>, is a sequence of tokens and directives.  The author seems to be confusing the preprocessor&#x27;s parse tree with the effect it has on the underlying text.<p>(Yes, the <i>output</i> of the preprocessor is dependent on what you define, but that has nothing to do with the <i>grammar</i>.  What the author claims is like saying a Lisp is context-sensitive because the factorial function produces a different values for different inputs!)<p>Now, if you could do <i>this</i>:<p><pre><code>    #define foobar define
    #foobar x 123
    x
</code></pre>
and get &quot;123&quot;, <i>that</i> would be a context-sensitive grammar.  But that is NOT a thing you can do!