Store peg rules by their id rather than word in left recursion handling
parent
9e78bb70f2
commit
2ed0d561ae
|
@ -93,8 +93,8 @@ reset-pegs
|
||||||
#! pos = the position in the input string of this entry
|
#! pos = the position in the input string of this entry
|
||||||
TUPLE: memo-entry ans pos ;
|
TUPLE: memo-entry ans pos ;
|
||||||
|
|
||||||
TUPLE: left-recursion seed rule head next ;
|
TUPLE: left-recursion seed rule-id head next ;
|
||||||
TUPLE: peg-head rule involved-set eval-set ;
|
TUPLE: peg-head rule-id involved-set eval-set ;
|
||||||
|
|
||||||
: rule-id ( word -- id )
|
: rule-id ( word -- id )
|
||||||
#! A rule is the parser compiled down to a word. It has
|
#! A rule is the parser compiled down to a word. It has
|
||||||
|
@ -123,15 +123,15 @@ TUPLE: peg-head rule involved-set eval-set ;
|
||||||
#! stack effect ( -- parse-result )
|
#! stack effect ( -- parse-result )
|
||||||
pos get swap execute process-rule-result ; inline
|
pos get swap execute process-rule-result ; inline
|
||||||
|
|
||||||
: memo ( pos rule -- memo-entry )
|
: memo ( pos id -- memo-entry )
|
||||||
#! Return the result from the memo cache.
|
#! Return the result from the memo cache.
|
||||||
rule-id packrat at
|
packrat at
|
||||||
! " memo result " write dup .
|
! " memo result " write dup .
|
||||||
;
|
;
|
||||||
|
|
||||||
: set-memo ( memo-entry pos rule -- )
|
: set-memo ( memo-entry pos id -- )
|
||||||
#! Store an entry in the cache
|
#! Store an entry in the cache
|
||||||
rule-id packrat set-at ;
|
packrat set-at ;
|
||||||
|
|
||||||
: update-m ( ast m -- )
|
: update-m ( ast m -- )
|
||||||
swap >>ans pos get >>pos drop ;
|
swap >>ans pos get >>pos drop ;
|
||||||
|
@ -163,13 +163,13 @@ TUPLE: peg-head rule involved-set eval-set ;
|
||||||
:: (setup-lr) ( r l s -- )
|
:: (setup-lr) ( r l s -- )
|
||||||
s head>> l head>> eq? [
|
s head>> l head>> eq? [
|
||||||
l head>> s (>>head)
|
l head>> s (>>head)
|
||||||
l head>> [ s rule>> suffix ] change-involved-set drop
|
l head>> [ s rule-id>> suffix ] change-involved-set drop
|
||||||
r l s next>> (setup-lr)
|
r l s next>> (setup-lr)
|
||||||
] unless ;
|
] unless ;
|
||||||
|
|
||||||
:: setup-lr ( r l -- )
|
:: setup-lr ( r l -- )
|
||||||
l head>> [
|
l head>> [
|
||||||
r V{ } clone V{ } clone peg-head boa l (>>head)
|
r rule-id V{ } clone V{ } clone peg-head boa l (>>head)
|
||||||
] unless
|
] unless
|
||||||
r l lrstack get (setup-lr) ;
|
r l lrstack get (setup-lr) ;
|
||||||
|
|
||||||
|
@ -177,7 +177,7 @@ TUPLE: peg-head rule involved-set eval-set ;
|
||||||
[let* |
|
[let* |
|
||||||
h [ m ans>> head>> ]
|
h [ m ans>> head>> ]
|
||||||
|
|
|
|
||||||
h rule>> r eq? [
|
h rule-id>> r rule-id eq? [
|
||||||
m ans>> seed>> m (>>ans)
|
m ans>> seed>> m (>>ans)
|
||||||
m ans>> failed? [
|
m ans>> failed? [
|
||||||
fail
|
fail
|
||||||
|
@ -191,15 +191,15 @@ TUPLE: peg-head rule involved-set eval-set ;
|
||||||
|
|
||||||
:: recall ( r p -- memo-entry )
|
:: recall ( r p -- memo-entry )
|
||||||
[let* |
|
[let* |
|
||||||
m [ p r memo ]
|
m [ p r rule-id memo ]
|
||||||
h [ p heads at ]
|
h [ p heads at ]
|
||||||
|
|
|
|
||||||
h [
|
h [
|
||||||
m r h involved-set>> h rule>> suffix member? not and [
|
m r rule-id h involved-set>> h rule-id>> suffix member? not and [
|
||||||
fail p memo-entry boa
|
fail p memo-entry boa
|
||||||
] [
|
] [
|
||||||
r h eval-set>> member? [
|
r rule-id h eval-set>> member? [
|
||||||
h [ r swap remove ] change-eval-set drop
|
h [ r rule-id swap remove ] change-eval-set drop
|
||||||
r eval-rule
|
r eval-rule
|
||||||
m update-m
|
m update-m
|
||||||
m
|
m
|
||||||
|
@ -214,8 +214,8 @@ TUPLE: peg-head rule involved-set eval-set ;
|
||||||
|
|
||||||
:: apply-non-memo-rule ( r p -- ast )
|
:: apply-non-memo-rule ( r p -- ast )
|
||||||
[let* |
|
[let* |
|
||||||
lr [ fail r f lrstack get left-recursion boa ]
|
lr [ fail r rule-id f lrstack get left-recursion boa ]
|
||||||
m [ lr lrstack set lr p memo-entry boa dup p r set-memo ]
|
m [ lr lrstack set lr p memo-entry boa dup p r rule-id set-memo ]
|
||||||
ans [ r eval-rule ]
|
ans [ r eval-rule ]
|
||||||
|
|
|
|
||||||
lrstack get next>> lrstack set
|
lrstack get next>> lrstack set
|
||||||
|
|
Loading…
Reference in New Issue