Improved strong/emph parsers to avoid exponential blowup. [jgm/peg-markdown]

See https://github.com/jgm/peg-markdown/commit/c59e682
This commit is contained in:
Michael Teichgräber 2013-01-23 22:24:50 +01:00
parent f42048b731
commit 54cb06d41a
2 changed files with 31 additions and 27 deletions

View File

@ -529,44 +529,48 @@ UlOrStarLine = (UlLine | StarLine) { $$ = p.mkString(yytext) }
StarLine = < "****" '*'* > | < Spacechar '*'+ &Spacechar > StarLine = < "****" '*'* > | < Spacechar '*'+ &Spacechar >
UlLine = < "____" '_'* > | < Spacechar '_'+ &Spacechar > UlLine = < "____" '_'* > | < Spacechar '_'+ &Spacechar >
SpaceInline = a:StartList
( (b:Space | b:Endline) { a = cons(b, a) } )+
c:Inline { a = cons(c, a); $$ = p.mkList(LIST, a) }
NonspaceInline = !Spacechar !Newline Inline
Emph = EmphStar | EmphUl Emph = EmphStar | EmphUl
OneStarOpen = !StarLine '*' !Spacechar !Newline EmphStar = '*'
OneStarClose = !Spacechar !Newline a:Inline '*' { $$ = a }
EmphStar = OneStarOpen
a:StartList a:StartList
( !OneStarClose Inline { a = cons($$, a) } )* ( !'*' b:NonspaceInline { a = cons(b, a) }
OneStarClose { a = cons($$, a) } | b:SpaceInline { a = cons(b, a) }
| b:StrongStar { a = cons(b, a) }
)+
'*'
{ $$ = p.mkList(EMPH, a) } { $$ = p.mkList(EMPH, a) }
OneUlOpen = !UlLine '_' !Spacechar !Newline EmphUl = '_'
OneUlClose = !Spacechar !Newline a:Inline '_' !Alphanumeric { $$ = a }
EmphUl = OneUlOpen
a:StartList a:StartList
( !OneUlClose Inline { a = cons($$, a) } )* ( !'_' b:NonspaceInline { a = cons(b, a) }
OneUlClose { a = cons($$, a) } | b:SpaceInline { a = cons(b, a) }
| b:StrongUl { a = cons(b, a) }
)+
'_'
{ $$ = p.mkList(EMPH, a) } { $$ = p.mkList(EMPH, a) }
Strong = StrongStar | StrongUl Strong = StrongStar | StrongUl
TwoStarOpen = !StarLine "**" !Spacechar !Newline StrongStar = "**"
TwoStarClose = !Spacechar !Newline a:Inline "**" { $$ = a }
StrongStar = TwoStarOpen
a:StartList a:StartList
( !TwoStarClose Inline { a = cons($$, a) } )* ( !"**" b:NonspaceInline { a = cons(b, a) }
TwoStarClose { a = cons($$, a) } | b:SpaceInline { a = cons(b, a) }
)+
"**"
{ $$ = p.mkList(STRONG, a) } { $$ = p.mkList(STRONG, a) }
TwoUlOpen = !UlLine "__" !Spacechar !Newline StrongUl = "__"
TwoUlClose = !Spacechar !Newline a:Inline "__" !Alphanumeric { $$ = a }
StrongUl = TwoUlOpen
a:StartList a:StartList
( !TwoUlClose Inline { a = cons($$, a) } )* ( !"__" b:NonspaceInline { a = cons(b, a) }
TwoUlClose { a = cons($$, a) } | b:SpaceInline { a = cons(b, a) }
)+
"__"
{ $$ = p.mkList(STRONG, a) } { $$ = p.mkList(STRONG, a) }
Image = '!' ( ExplicitLink | ReferenceLink ) Image = '!' ( ExplicitLink | ReferenceLink )

2
portid
View File

@ -1 +1 @@
179 191