Advertisement
Guest User

Lisp Tokenizer

a guest
Mar 3rd, 2024
210
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Nim 1.33 KB | None | 0 0
  1. import std/os
  2. import std/streams
  3. import std/deques
  4.  
  5. var strm = newFileStream(paramStr(1), fmRead)
  6. var stack = initDeque[string]()
  7. var arr = newSeq[string]()
  8.  
  9. proc startEnclosure(token: string) {.discardable.} =
  10.   echo token
  11.   stack.addFirst(token)
  12.   arr.insert(token, 0)
  13.  
  14. proc endEnclosure(token: string) {.discardable.} =
  15.   echo token
  16.   discard stack.popFirst
  17.   arr.insert(token, 0)
  18.  
  19. if not isNil(strm):
  20.   while true:
  21.     var s = strm.readChar()
  22.    
  23.     if s == '(':
  24.       startEnclosure("<LIST START>")
  25.  
  26.     elif s == '#':
  27.       if strm.peekChar() == '(':
  28.         startEnclosure("<LAMBDA START>")
  29.       elif strm.peekChar() == '{':
  30.         startEnclosure("<SET START>")
  31.  
  32.     elif s == ')':
  33.       if stack.peekFirst == "<LIST START>":
  34.         endEnclosure("<LIST END>")
  35.       elif stack.peekFirst == "<LAMBDA START>":
  36.         endEnclosure("<LAMBDA END>")
  37.  
  38.     elif s == '[':
  39.       startEnclosure("<VECTOR START>")
  40.  
  41.     elif s == ']':
  42.       endEnclosure("<VECTOR END>")
  43.  
  44.     elif s == '{':
  45.       startEnclosure("<MAP START>")
  46.  
  47.     elif s == '}':
  48.       if stack.peekFirst == "<SET START>":
  49.         endEnclosure("<SET END>")
  50.       elif stack.peekFirst == "<MAP START>":
  51.         endEnclosure("<MAP END>")
  52.      
  53.     else:
  54.       echo s
  55.    
  56.     if strm.peekChar() == '\x00':
  57.       break
  58.  
  59.   strm.close()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement