Moontalk server and client (provided by many parties)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

65 lines
1.9KB

  1. \ Simple stateful parsing module.
  2. 0
  3. cell +field parser-string
  4. cell +field parser-size
  5. cell +field parser-marker
  6. cell +field parser-cursor
  7. constant PARSER_SIZE
  8. variable context
  9. : (context@) ( -- parser-addr ) context @ ;
  10. : (context!) ( parser-addr -- ) context ! ;
  11. : (string@) ( -- c-addr ) (context@) parser-string @ ;
  12. : (string!) ( c-addr -- ) (context@) parser-string ! ;
  13. : (size@) ( -- u ) (context@) parser-size @ ;
  14. : (size!) ( u -- ) (context@) parser-size ! ;
  15. : (marker@) ( -- u ) (context@) parser-marker @ ;
  16. : (marker!) ( u -- ) (context@) parser-marker ! ;
  17. : (cursor@) ( -- u ) (context@) parser-cursor @ ;
  18. : (cursor!) ( u -- ) (context@) parser-cursor ! ;
  19. : new-parser ( c-addr u parser-addr -- )
  20. (context!) (size!) (string!) 0 dup (marker!) (cursor!) ;
  21. : restore-parser ( parser-addr -- ) (context!) ;
  22. : current-parser ( -- parser-addr ) (context@) ;
  23. : parser-here ( -- u ) (cursor@) ;
  24. : parser-marker ( -- u ) (marker@) ;
  25. : parser-mark ( -- ) (cursor@) (marker!) ;
  26. : parser-backtrack ( -- ) (marker@) (cursor!) ;
  27. : parser-remaining ( -- c-addr u )
  28. (string@) (cursor@) + (size@) (cursor@) - ;
  29. : parser-extract ( -- c-addr u )
  30. (string@) (marker@) + (cursor@) (marker@) - ;
  31. : parser>>| ( -- ) (size@) (cursor!) ;
  32. : parser|<< ( -- ) 0 (cursor!) ;
  33. : parser>> ( u -- ) (cursor@) + (size@) min 0 max (cursor!) ;
  34. : parser<< ( u -- ) negate parser>> ;
  35. : parser>>string ( c-addr u -- flag )
  36. parser-remaining 2swap search IF
  37. drop (string@) - (cursor!) true
  38. ELSE
  39. 2drop false
  40. THEN ;
  41. : parser>>|string ( c-addr u -- flag )
  42. parser>>string ;
  43. : parser>>string| ( c-addr u -- flag )
  44. dup -rot parser>>string IF
  45. parser>> true
  46. ELSE
  47. drop false
  48. THEN ;
  49. : with-parser ( xt parser-addr -- )
  50. (context@) >r (context!) execute r> (context!) ;
  51. : with-new-parser ( xt str parser-addr -- )
  52. (context@) >r new-parser execute r> (context!) ;