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
====