Re: How to write parser?

2017-05-15 Thread crimaniak via Digitalmars-d-learn

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?

2017-05-14 Thread Suliman via Digitalmars-d-learn
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?