This repository has been archived by the owner on Dec 19, 2023. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #10 from X-R-G-B/3-compute-ast
Compute basic ast
- Loading branch information
Showing
9 changed files
with
252 additions
and
12 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -170,6 +170,7 @@ tags | |
/glados | ||
|
||
*.log | ||
*.exe | ||
|
||
/make.exe | ||
/libssp-0.dll | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,14 +1,12 @@ | ||
{- | ||
-- EPITECH PROJECT, 2023 | ||
-- Main | ||
-- Koaky | ||
-- File description: | ||
-- Main | ||
-} | ||
|
||
module Main (main) where | ||
|
||
import AST (showMaybeTree) | ||
import TextToAST (textToAST) | ||
import AST | ||
import TextToAST | ||
|
||
main :: IO () | ||
main = putStrLn (showMaybeTree (textToAST "(fst 1 (scd 2 3 4) 12)")) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,10 +1,70 @@ | ||
{- | ||
-- EPITECH PROJECT, 2023 | ||
-- Compute an AST | ||
-- Koaky | ||
-- File description: | ||
-- ComputeAST | ||
-} | ||
|
||
module ComputeAST | ||
( | ||
computeAST, | ||
computeAllAST | ||
) where | ||
|
||
import AST | ||
import Defines | ||
import Data.Int (Int64) | ||
import Functions | ||
|
||
------------ ComputeNode ------------ | ||
|
||
computeNode :: Env -> Tree -> Int64 | ||
computeNode env tree@(Node "+" _ _) = additionTree env tree | ||
computeNode env tree@(Node "-" _ _) = substactionTree env tree | ||
computeNode env tree@(Node "*" _ _) = multiplicationTree env tree | ||
computeNode env tree@(Node "div" _ _) = divisionTree env tree | ||
computeNode env tree@(Node "mod" _ _) = moduloTree env tree | ||
-- TODO: Error handling | ||
computeNode _ _ = 0 | ||
|
||
------------ Resolve deepest ------------ | ||
|
||
resolveDeepestNode :: Env -> Tree -> Tree | ||
-- Node [Leaf] [Leaf] | ||
resolveDeepestNode env (Node symbol (Just (Leaf left)) (Just (Leaf right))) = | ||
Leaf (Number (computeNode env | ||
(Node symbol (Just (Leaf left)) (Just (Leaf right))))) | ||
-- Node [Leaf] [Node] | ||
resolveDeepestNode env (Node symbol (Just (Leaf left)) (Just right)) = | ||
Node symbol (Just (Leaf left)) (Just $ resolveDeepestNode env right) | ||
-- Node [Node] [Leaf] | ||
resolveDeepestNode env (Node symbol (Just left) (Just (Leaf right))) = | ||
Node symbol (Just $ resolveDeepestNode env left) (Just (Leaf right)) | ||
-- Node [Node] [Node] | ||
resolveDeepestNode env (Node symbol (Just left) (Just right)) = | ||
Node symbol (Just $ resolveDeepestNode env left) | ||
(Just $ resolveDeepestNode env right) | ||
-- TODO: Error handling | ||
resolveDeepestNode _ _ = (Leaf (Number 0)) | ||
|
||
------------ COMPUTE TREE ---------- | ||
|
||
computeTree :: Env -> Tree -> Atom | ||
computeTree env (Leaf (Symbol symbol)) = Number (getSymbolValue env symbol) | ||
computeTree _ (Leaf (Number number)) = Number number | ||
computeTree _ (Leaf (Boolean value)) = Boolean value | ||
computeTree env tree = computeTree env (resolveDeepestNode env tree) | ||
|
||
------------ COMPUTE AST ------------ | ||
|
||
computeAST :: Env -> Tree -> (Env, Maybe Atom) | ||
computeAST env tree@(Node "define" _ _) = (registerDefine env tree, Nothing) | ||
computeAST env tree = (env, Just (computeTree env tree)) | ||
|
||
-- Call computeAST on every tree in the list | ||
computeAllAST :: Env -> [Tree] -> [Atom] | ||
computeAllAST _ [] = [] | ||
computeAllAST env (tree:rest) = case atom' of | ||
Just atom -> atom : computeAllAST newEnv rest | ||
Nothing -> computeAllAST newEnv rest | ||
where (newEnv, atom') = computeAST env tree |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,48 @@ | ||
{- | ||
-- EPITECH PROJECT, 2023 | ||
-- Koaky | ||
-- File description: | ||
-- Defines | ||
-} | ||
|
||
module Defines | ||
( | ||
Define (Define), | ||
Env (Env), | ||
registerDefine, | ||
getSymbolValue | ||
) where | ||
|
||
import AST | ||
import Data.Int (Int64) | ||
|
||
-- Define = <SYMBOL> <EXPRESSION> | ||
data Define = Define { | ||
symbol :: String, | ||
expression :: Atom | ||
} deriving (Show) | ||
|
||
-- used to store defines, and more in the future | ||
data Env = Env { | ||
defines :: [Define] | ||
} deriving (Show) | ||
|
||
-- TODO: Handle case where the define is a lambda / not defined | ||
getSymbolValue :: Env -> String -> Int64 | ||
getSymbolValue (Env []) _ = 0 | ||
getSymbolValue (Env ((Define symbl value):rest)) symbolToFind | ||
| symbl == symbolToFind = case value of | ||
(Number number) -> number | ||
(Boolean True) -> 1 | ||
(Boolean False) -> 0 | ||
(Symbol _) -> 0 | ||
| otherwise = getSymbolValue (Env rest) symbolToFind | ||
|
||
-- Register a define in the Defines list | ||
registerDefine :: Env -> Tree -> Env | ||
registerDefine env | ||
(Node "define" | ||
(Just (Leaf (Symbol defSymbol))) | ||
(Just (Leaf defexpression))) | ||
= env { defines = defines env ++ [Define defSymbol defexpression] } | ||
registerDefine env _ = env |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,82 @@ | ||
{- | ||
-- EPITECH PROJECT, 2023 | ||
-- Koaky | ||
-- File description: | ||
-- ComputeAST | ||
-} | ||
|
||
module Functions | ||
( | ||
additionTree, | ||
substactionTree, | ||
multiplicationTree, | ||
divisionTree, | ||
moduloTree | ||
) where | ||
|
||
import AST | ||
import Defines | ||
import Data.Int (Int64) | ||
|
||
-- Compute a "+ - div * mod" node, using defines if needed | ||
-- Todo: See for an error handling and division by 0 | ||
|
||
additionTree :: Env -> Tree -> Int64 | ||
additionTree _ (Node "+" (Just (Leaf (Number left))) | ||
(Just (Leaf (Number right)))) = left + right | ||
additionTree env (Node "+" (Just (Leaf (Number left))) | ||
(Just (Leaf (Symbol right)))) = left + getSymbolValue env right | ||
additionTree env (Node "+" (Just (Leaf (Symbol left))) | ||
(Just (Leaf (Number right)))) = getSymbolValue env left + right | ||
additionTree env (Node "+" (Just (Leaf (Symbol left))) | ||
(Just (Leaf (Symbol right)))) = | ||
getSymbolValue env left + getSymbolValue env right | ||
additionTree _ _ = 0 | ||
|
||
substactionTree :: Env -> Tree -> Int64 | ||
substactionTree _ (Node "-" (Just (Leaf (Number left))) | ||
(Just (Leaf (Number right)))) = left - right | ||
substactionTree env (Node "-" (Just (Leaf (Number left))) | ||
(Just (Leaf (Symbol right)))) = left - getSymbolValue env right | ||
substactionTree env (Node "-" (Just (Leaf (Symbol left))) | ||
(Just (Leaf (Number right)))) = getSymbolValue env left - right | ||
substactionTree env (Node "-" (Just (Leaf (Symbol left))) | ||
(Just (Leaf (Symbol right)))) = | ||
getSymbolValue env left - getSymbolValue env right | ||
substactionTree _ _ = 0 | ||
|
||
multiplicationTree :: Env -> Tree -> Int64 | ||
multiplicationTree _ (Node "*" (Just (Leaf (Number left))) | ||
(Just (Leaf (Number right)))) = left * right | ||
multiplicationTree env (Node "*" (Just (Leaf (Number left))) | ||
(Just (Leaf (Symbol right)))) = left * getSymbolValue env right | ||
multiplicationTree env (Node "*" (Just (Leaf (Symbol left))) | ||
(Just (Leaf (Number right)))) = getSymbolValue env left * right | ||
multiplicationTree env (Node "*" (Just (Leaf (Symbol left))) | ||
(Just (Leaf (Symbol right)))) = | ||
getSymbolValue env left * getSymbolValue env right | ||
multiplicationTree _ _ = 0 | ||
|
||
divisionTree :: Env -> Tree -> Int64 | ||
divisionTree _ (Node "div" (Just (Leaf (Number left))) | ||
(Just (Leaf (Number right)))) = left `div` right | ||
divisionTree env (Node "div" (Just (Leaf (Number left))) | ||
(Just (Leaf (Symbol right)))) = left `div` getSymbolValue env right | ||
divisionTree env (Node "div" (Just (Leaf (Symbol left))) | ||
(Just (Leaf (Number right)))) = getSymbolValue env left `div` right | ||
divisionTree env (Node "div" (Just (Leaf (Symbol left))) | ||
(Just (Leaf (Symbol right)))) = | ||
getSymbolValue env left `div` getSymbolValue env right | ||
divisionTree _ _ = 0 | ||
|
||
moduloTree :: Env -> Tree -> Int64 | ||
moduloTree _ (Node "mod" (Just (Leaf (Number left))) | ||
(Just (Leaf (Number right)))) = left `mod` right | ||
moduloTree env (Node "mod" (Just (Leaf (Number left))) | ||
(Just (Leaf (Symbol right)))) = left `mod` getSymbolValue env right | ||
moduloTree env (Node "mod" (Just (Leaf (Symbol left))) | ||
(Just (Leaf (Number right)))) = getSymbolValue env left `mod` right | ||
moduloTree env (Node "mod" (Just (Leaf (Symbol left))) | ||
(Just (Leaf (Symbol right)))) = | ||
getSymbolValue env left `mod` getSymbolValue env right | ||
moduloTree _ _ = 0 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters