Re: How to write parser?
On Sunday, 14 May 2017 at 19:00:09 UTC, Suliman wrote: I am trying to learn how to write text parser. I have example doc with follow format: #Header my header text ##SubHeader my sub header text it's there any better way to parse such format? Ready markdown Pegged based parser: https://github.com/PhilippeSigaud/Pegged/blob/master/pegged/examples/markdown.d
How to write parser?
I am trying to learn how to write text parser. I have example doc with follow format: #Header my header text ##SubHeader my sub header text ###Sub3Header my sub 3 text #Header21 my header2 text ##SubHeader21 my header2 text ###SubHeader22 my header3 text I would like to wrap all level(#) tags to HTML div's, to get it's look like: #Header my header text ##SubHeader my sub header text ###Sub3Header my sub 3 text #Header21 my header2 text ##SubHeader21 my header2 text ###SubHeader22 my header3 text It's seems that I wrong understand parser logic. I am trying to do it's in next way: bool isH1Open; bool isH2Open; bool isH3Open; string newcontent; foreach(line; content.lineSplitter) { if(line.length > 3) // to prevent access to line < 3 symblos { if(!isH1Open && line[0] == '#' && line[1] != '#') { isH1Open = true; line = `` ~ "\n" ~ line ; newcontent ~= line; continue; } if(isH2Open && line[1] == '#' && line[2] != '#') { isH2Open = false; line = "\n" ~ `` ~ "\n"; newcontent ~= line; continue; } if(isH1Open && line[0] == '#' && line[1] != '#') { isH1Open = false; line = "\n" ~ `` ~ "\n"; newcontent ~= line; continue; } if(!isH2Open && line[1] == '#' && line[2] != '#') { isH2Open = true; line = "\n" ~ `` ~ "\n" ~ line ; newcontent ~= line; continue; } } But I am getting wrong output: #Header ##SubHeader #Header31 ##SubHeader31 it's there any better way to parse such format?