Hi Andy, Instead of adding the definition
cmd ::= set_item. have you thought about defining the acceptable alternatives to "SET"? For instance, set ::= SET. set ::= . cmd ::= set set_list. The way you specified it on "cmd" I think created your problem. By adding another level it may give the parser enough room to work the way you wanted. I haven't tried your specific grammar, but I had a similar issue and this seemed to work for me. Regards, -Allan > -----Original Message----- > From: sqlite-users-boun...@sqlite.org [mailto:sqlite-users- > boun...@sqlite.org] On Behalf Of Andy Gibbs > Sent: Thursday, April 01, 2010 8:04 AM > To: sqlite-users@sqlite.org > Subject: Re: [sqlite] Question about lemon > > Hi, sorry to bump this thread, but I thought I'd just try once more to > see > whether anybody might have some insight on the problem I'm having with > Lemon, as detailed in the original post below. I'm sure posts that > languish > on this mailing list quickly get snowed under! I appreciate its not an > Sqlite question, but I don't know where else to post questions about > Lemon. > > Thanks!!! > Andy > > > ----- Original Message ----- > From: "Andy Gibbs" > Sent: Wednesday, March 10, 2010 10:54 AM > Subject: Question about lemon > > > Hello, > > > > Is it alright to ask a quick question about the lemon parser in this > > mailing list, or is there a dedicated one which I should post this to > > instead? > > > > I'm using lemon to create a parser for a simple c/basic-like grammar, > > and have among other rules, the following defined (I've trimmed it > down > > to what I believe are the important bits for this email, so hopefully > > its all there): > > > > cmd ::= WHILE expr DO cmd_list END. > > cmd ::= CASE case_list END. > > cmd ::= SET set_list. > > cmd_list ::= cmd_list cmd SEMI. > > cmd_list ::= cmd SEMI. > > case_list ::= case_list case_cond cmd_list. > > case_list ::= case_cond cmd_list. > > case_cond ::= WHEN expr THEN. > > case_cond ::= ELSE. > > set_list ::= set_list COMMA set_item. > > set_list ::= set_item. > > set_item ::= ID ASSIGN expr. > > > > This in itself works correctly, parsing such code as... > > > > SET a := 0; > > WHILE a < 12 DO > > some_other_statement; > > CASE WHEN a = 5 THEN > > another_statement; > > yet_another_statement; > > WHEN a = 11 THEN > > do_something; > > END; > > SET a := a+1; > > END; > > > > However, I would like to be able to add the rule: > > > > cmd ::= set_item. > > > > so that the "SET" keyword becomes optional in the above code (i.e. so > > that I can write "a := 0;" instead of "SET a := 0;"). When I do this > > however, the parser then fails to parse CASE constructs. > > > > I believe I know where the problem lies: I am using the %fallback > > directive which includes a number of keywords that fallback to "ID", > > and in this list is the "END" keyword. Ideally I would like to leave > > the fallback list as it is, if possible, and in fact I'd much rather > > not add the additional rule than change this! > > > > What interests me is that the WHILE construct still parses correctly. > > An output from the parser trace gives the following: > > > > ... > > Stack: WHILE expr DO cmd SEMI > > Input END > > Reduce [cmd_list ::= cmd SEMI]. > > Shift 8 > > Stack: WHILE expr DO cmd_list END > > Input SEMI > > Reduce [cmd ::= WHILE expr DO cmd_list END]. > > Shift 410 > > Stack: cmd > > Shift 515 > > Stack: cmd SEMI > > ... > > > > But with the CASE construct, I get: > > > > ... > > Stack: CASE case_list case_cond cmd SEMI > > Input END > > Reduce [cmd_list ::= cmd SEMI]. > > Shift 10 > > Stack: CASE case_list case_cond cmd_list > > FALLBACK END => ID > > Shift 713 > > Stack: CASE case_list case_cond cmd_list END > > Input SEMI > > Syntax error! > > > > My understanding is that it simply isn't able to reduce "CASE > case_list > > case_cond cmd_list END" to "CASE case_list END" and then "cmd" and so > > instead takes "END" to be the left-hand-side of the "set_item" rule > as > > a continuation of "cmd_list", gets a semi-colon as the next character > > which according to that rule would be a syntax error. > > > > My question -- sorry this is such a long post -- is, what is it about > > the grammar for WHILE which allows it to work, and CASE that causes > it > > to fail? It is because there is an extra "list" level in the grammar > > ("case_list" -> "cmd_list", instead of just "cmd_list")? Is there > any > > way I can change the grammar to do what I hope to do, or is this a > > limitation of lemon? I've tried adding a rule "cmd ::= CASE > case_cond > > cmd_list END" but this causes a parsing conflict error message in > lemon. > > I've also had a look into the lemon source code to see if I could > find > > an answer there, but I'm afraid its engineering brilliance is beyond > me! > > > > Thank you very much for any help that can be offered. > > Andy > > _______________________________________________ sqlite-users mailing list sqlite-users@sqlite.org http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users