[OT] Haxe "if" context-sensitive? (Q for Grammar Experts)
Nick Sabalausky
a at a.a
Sun Aug 30 21:52:48 PDT 2009
I've been trying to make a grammar for the Haxe langauge, and I've been
having a hell of a time emulating it's expression-based if/if-else (as
opposed to statement-based as in D). I'm sure a big part of it is my
inexperience with writing grammars, but I've also been starting to wonder if
it's impossible to do context-free. For those unfamiliar, here's how the
relevant parts in Haxe work:
------------------------------------------
// Each of these are invalid:
1 // Missing ';'
; // Unexpected ';'
foo = 1 // Missing ';'
foo = 1;; // Unexpected ';'
// AIUI, Each of these lines are syntactically separate from
// each other (but not because they're on separate lines),
// and work as expected.
{}
{};
1;
{1;}
{1;};
bar();
{bar();}
{bar();};
if(foo==1) {}
if(foo==1) {};
if(foo==1) 1;
if(foo==1) {1;}
if(foo==1) {1;};
if(foo==1) bar();
if(foo==1) {bar();}
if(foo==1) {bar();};
if(foo==1) {} else whatever;
if(foo==1) {}; else whatever;
if(foo==1) 1; else whatever;
if(foo==1) {1;} else whatever;
if(foo==1) {1;}; else whatever;
if(foo==1) bar(); else whatever;
if(foo==1) {bar();} else whatever;
if(foo==1) {bar();}; else whatever;
if(foo==1) 1 else whatever;
if(foo==1) bar() else whatever;
// else binds to nearest if
if(foo==1) if(foo==2) whatever else whatever;
if(foo==1) if(foo==2) whatever; else whatever;
if(foo==1) if(foo==2) whatever else whatever else whatever;
if(foo==1) if(foo==2) whatever; else whatever; else whatever;
// assignments
foo = {}
foo = {};
// Etc...
foo = if(foo==1) {}
foo = if(foo==1) {};
// Etc...
foo = if(foo==1) {} else whatever;
foo = if(foo==1) {}; else whatever;
// Etc...
foo = if(foo==1) if(foo==2) whatever else whatever;
foo = if(foo==1) if(foo==2) whatever; else whatever;
foo = if(foo==1) if(foo==2) whatever else whatever else whatever;
foo = if(foo==1) if(foo==2) whatever; else whatever; else whatever;
------------------------------------------
So, anyone know if a grammar that handles this would need to be
context-sensitive? Or am I just *really* bad at this? ;)
More information about the Digitalmars-d
mailing list