Advertisement
ptrelford

SNOBOL FSM Parser

Dec 23rd, 2014
295
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.28 KB | None | 0 0
  1. HEADER = TABLE()
  2. TRANS = TABLE()
  3. DATA('TRANSITION(EVENT,NEWSTATE,ACTIONS,LINK)')
  4. DATA('LIST(VALUE,NEXT)')
  5. * WORD & WHITESPACE PATTERNS
  6. LETTERS = &LCASE &UCASE
  7. WORD = SPAN(LETTERS)
  8. WS = SPAN(' ')
  9. * HEADER PARSER
  10. NEXTHDR LINE = INPUT
  11. OUTPUT = LINE
  12. LINE (ARB . KEY) ':' WS (WORD . VALUE) :S(ADDHDR)
  13. LINE POS(0) '{' :S(PTRANS) F(NEXTHDR)
  14. ADDHDR HEADER<KEY> = VALUE
  15. OUTPUT = KEY '=' VALUE :(NEXTHDR)
  16. * TRANSITION PARSER
  17. PTRANS POLDST = WORD . OLDST
  18. PEVENT = WORD . EVENT
  19. PNEWST = WORD . NEWST
  20. PACTIONS = REM . ACTIONS
  21. N = 0
  22. NEXTTRAN LINE = INPUT
  23. OUTPUT = LINE
  24. LINE POLDST WS PEVENT WS PNEWST WS PACTIONS :S(ADDTRAN)
  25. LINE POS(0) '}' :S(PARSED) F(NEXTTRAN)
  26. ADDTRAN OUTPUT = OLDST '-' EVENT '-' NEWST '-' ACTIONS
  27. N = N + 1
  28. ACTIONS POS(0) WORD . ACT1 :S(TOACT1)
  29. ACTIONS '{' ARB . ACTS '}' :S(TOACTS)
  30. STTRAN TRANS<OLDST> = TRANSITION(EVENT,NEWST,ACTIONS,TRANS<OLDST>)
  31. OUTPUT = ACTIONS(TRANS<OLDST>) :(NEXTTRAN)
  32. * SINGLE ACTION PARSER
  33. TOACT1 ACTIONS = LIST(ACT1)
  34. OUTPUT = ACT1 :(STTRAN)
  35. * MANY ACTION PARSER
  36. TOACTS ACTIONS = LIST()
  37. CURRENT = ACTIONS
  38. NEXTACT ACTS (WORD . ACT) = :F(STTRAN)
  39. VALUE(CURRENT) = ACT
  40. LAST :S(FIRSTACT)
  41. NEXT(LAST) = CURRENT
  42. FIRSTACT LAST = CURRENT
  43. CURRENT = LIST()
  44. ACTS WS = :(NEXTACT)
  45. PARSED OUTPUT = 'PARSED ' N
  46. END
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement