SQLite Forum

Lemon SQL output omition
Login
Looking at using the sql output of lemon to generate the railroad diagram from the parser I noticed that lemon is omitting info from the rhs side of rules that have '|' like this rule from sqlite3/src/parse.y:

====
cmd ::= COMMIT|END(X) trans_opt. 
====

The lemon SQL output:
====
INSERT INTO rule(ruleid,lhs,txt)VALUES(8,189,'cmd ::= COMMIT|END trans_opt');
INSERT INTO rulerhs(ruleid,pos,sym)VALUES(8,0,10);
-- here somehow the '|' should be present
INSERT INTO rulerhs(ruleid,pos,sym)VALUES(8,0,11);
INSERT INTO rulerhs(ruleid,pos,sym)VALUES(8,1,191);
====

I noticed it when trying this query over the lemon SQL output for sqlite3/src/parse.y:

====
select name || ' ::= ' || group_concat(rhs, '
	|')
from (
	select id, name, group_concat(ifnull(rhs_name, '/* empty */'), ' ') as rhs
	from (
		select symbol.id, symbol.name, rule.ruleid, rulerhs.pos, rulerhs.sym, s2.name as rhs_name
		from symbol
			left join rule on symbol.id=rule.lhs
			left join rulerhs on rule.ruleid=rulerhs.ruleid
			left join symbol as s2 on rulerhs.sym=s2.id
		where symbol.isTerminal=0
		order by symbol.id, rule.ruleid, rulerhs.pos
	) as tbl
	group by id, ruleid
) as tbl2
group by id
====

Partial query output:
====
input ::= cmdlist
cmdlist ::= cmdlist ecmd
	|ecmd
ecmd ::= SEMI
	|cmdx SEMI
	|explain cmdx SEMI
cmdx ::= cmd
explain ::= EXPLAIN
	|EXPLAIN QUERY PLAN
cmd ::= BEGIN transtype trans_opt
	|COMMIT END trans_opt //!! here the '|' is missing
	|ROLLBACK trans_opt
	|SAVEPOINT nm
====