[Mono-dev] misc: C# request info

Marek Safar marek.safar at seznam.cz
Tue Feb 24 04:23:13 EST 2009


Hi,
>>> my guess is that it works like this:
>>> the group of files is loaded;
>>> each file is preprocessed and parsed (it is looking like C# uses a 
>>> context-independent syntax?...);
>>>
>> Incorrect, C# uses context dependent keywords.
>
> I meant, context independent as in, the parser can parse things 
> without knowing about previous declarations.
> in C, it is necessary to know about declarations (typedefs, structs, 
> ...) in order to be able to parse (otherwise... the syntax is 
> ambiguous...).
>
> sadly, I am not all that familiar in detail with C#'s syntax.
>
> in C#, this would mean having to know about all of the classes in all 
> of the visible namespaces before being able to parse, which would not 
> seem to be the case.
Correct, you don't have to know whether a token is definitely type but 
you have to know whether it can be a type.

>
>>> all of the namespaces and declarations are "lifted out" of the parse 
>>> trees;
>>> each file's parse tree can then be compiled.
>>>
>>> from what I can tell, types are like this:
>>> type = <qualifiers>* <type-name>
>>>
>>> so, I can type:
>>> static Foo bar;
>>>
>>>
>>> and the parser will know that 'Foo' is the type, even if the type 
>>> for Foo is not visible at the time of parsing (in C, this can't be 
>>> done since there is no clear distinction or ordering between types 
>>> and qualifiers, and so one would not know if 'Foo' is the type, or 
>>> an intended variable name with the type being assumed to be 'int').
>>>
>> No, parser does not yet know the type of 'Foo'.
>>
>
> I am not certain which way you mean this.
> 'no', as in it does not know the type, but still parses it;
> 'no', as in it can't yet be parsed.
C# parser does not complain because Foo can represent a type (primitive 
type, imported, delegate, generic type, etc.)

>>> unsigned int i;
>>> int unsigned i;
>>> int volatile i;
>>> _Complex float f;
>>> double _Complex g;
>>>
>>> unsigned i;
>>> short int j;
>>> int long k;
>>> ..
>>>
>>> so, my guess then is that C# code is "just parsed", with no need to 
>>> lookup, for example, is Foo a "struct or class or other typedef'ed 
>>> type?" ...
>>>
>>> as far as the parser is concerned 'int' or 'byte' is syntactically 
>>> not different from 'Foo' or 'Bar'?...
>>>
>> Correct.
>>
> so, in C we can have:
>
> C also has certain ugly syntactic forms which I will just assume that 
> C# does not, such as:
> int (*foo(int x, int y))(int z);
>
C# has some tricky syntax too, some tokens change behaviour of following 
block. Some are just tricky to parse like generics, nullables, lambdas, etc.

Here is one example

Foo (x <y, z> (0));


Marek


More information about the Mono-devel-list mailing list