qwertie / ecsharp

Home of LoycCore, the LES language of Loyc trees, the Enhanced C# parser, the LeMP macro preprocessor, and the LLLPG parser generator.
http://ecsharp.net
Other
177 stars 25 forks source link

LeMP throws away variable in cast #65

Closed j4m3z0r closed 5 years ago

j4m3z0r commented 6 years ago

This code:

#ecs;

var a = "I'm a string!";
if(a is string s) {
    Console.WriteLine(s);
}

Will produce the following:

// Generated from Untitled.ecs by LeMP 2.6.2.3.
var a = "I'm a string!";
if (a is string) {
    Console.WriteLine(s);
}

Note that the 's' has been dropped from the end of the a is string if condition. AFAIK this shouldn't happen -- the original code compiled and worked just fine.

qwertie commented 6 years ago

You caught me. I've been meaning to add C# 7 syntax for a long time now... but was waiting for someone to indicate that they wanted it.

This particular feature is implemented it in a branch but I got stumped on how to support the other major C# 7 feature, tuple return types... (distinguishing between method declarations and ordinary statements was already fairly complex and tuples make it much harder in the presence of an additional feature of EC#, word attributes. It seems like I might need to write a bottom-up parser for prediction (LALR(1)), which I've never done by hand. Alternately I could try a recovery technique where we first try to parse everything as an expression, then restart parsing as a method/var/prop decl if an error occurs. Edit: wait, no, X*Y must be treated as a var decl, can't try parsing as expression first.)

So I tried merging recent changes into the csharp7 branch but something went wrong and the test suite fails. I'll investigate that today.

qwertie commented 6 years ago

I have pushed support for x is T y to master (v2.6.3).