Skip to content

Instantly share code, notes, and snippets.

@robkuz
Created September 1, 2014 09:31
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save robkuz/03d4900eb9c2fd5ad641 to your computer and use it in GitHub Desktop.
Save robkuz/03d4900eb9c2fd5ad641 to your computer and use it in GitHub Desktop.
A Elixir Parser - Transforming a List of Tokens into a "Tree" (List of List)
defmodule Parser do
def read(input) do
tokens = Tokenizer.tokenize(input)
parse tokens, []
end
def parse([], stack) do
stack
end
#the input comes in the form of: ["(", "foo", "1", "(", "bar", "2", ")", ")"]
#and shall produce: [:list, "foo", "1", [:list, "bar", "2"]]
def parse(input, stack \\ []) do
[token | tail] = input
case token do
"(" ->
stack = stack ++ [[:list]]
")" ->
last = List.last(stack)
stack = List.delete_at(stack, -1)
if stack != [] do
prev = List.last(stack)
stack = List.delete_at(stack, -1)
prev = prev ++ [last]
stack = stack ++ [prev]
else
stack = last
end
_ ->
last = List.last(stack)
stack = List.delete_at(stack, -1)
last = last ++ [token]
stack = stack ++ [last]
end
parse tail, stack
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment