Handle left recursion by failing again
parent
cca4700e49
commit
010ce80076
|
@ -144,16 +144,17 @@ IN: peg.ebnf.tests
|
|||
"Z" [EBNF foo=[^A-Z] EBNF] call
|
||||
] unit-test
|
||||
|
||||
[
|
||||
{ V{ 49 } } [
|
||||
#! Test direct left recursion. Currently left recursion should cause a
|
||||
#! failure of that parser.
|
||||
"1+1" [EBNF num=([0-9])+ expr=expr "+" num | num EBNF] call
|
||||
] must-fail
|
||||
#! Using packrat, so first part of expr fails, causing 2nd choice to be used
|
||||
"1+1" [EBNF num=([0-9])+ expr=expr "+" num | num EBNF] call parse-result-ast
|
||||
] unit-test
|
||||
|
||||
[
|
||||
{ V{ 49 } } [
|
||||
#! Test indirect left recursion. Currently left recursion should cause a
|
||||
#! failure of that parser.
|
||||
#! Using packrat, so first part of expr fails, causing 2nd choice to be used
|
||||
"1+1" [EBNF num=([0-9])+ x=expr expr=x "+" num | num EBNF] call
|
||||
] must-fail
|
||||
"1+1" [EBNF num=([0-9])+ x=expr expr=x "+" num | num EBNF] call parse-result-ast
|
||||
] unit-test
|
||||
|
||||
|
|
|
@ -67,10 +67,12 @@ C: <memo-entry> memo-entry
|
|||
|
||||
:: apply-non-memo-rule ( r p -- ast )
|
||||
[let* |
|
||||
m [ fail p <memo-entry> dup p r set-memo ]
|
||||
ans [ r eval-rule ]
|
||||
m [ ans pos get <memo-entry> ]
|
||||
|
|
||||
m p r set-memo ans
|
||||
ans m (>>ans)
|
||||
pos get m (>>pos)
|
||||
ans
|
||||
] ;
|
||||
|
||||
: apply-memo-rule ( m -- ast )
|
||||
|
|
Loading…
Reference in New Issue