packages feed

yapb-0.1.0: app/syntaxcompletion/Main.hs

module Main where

import CommonParserUtil

import Token
import Lexer
import Terminal
import Parser
import EmacsServer
import System.IO

import Data.Typeable
import Control.Exception

main :: IO ()
main = do
  emacsServer computeCand
  
  -- text <- readline "Enter text to parse: "
  -- doProcess text

-- Computing candidates for syntax completion

computeCand :: String -> Int -> IO [String]
computeCand str cursorPos = ((do
  terminalList <- lexing lexerSpec str 
  ast <- parsing parserSpec terminalList
  putStrLn "successfully parsed"
  return ["SuccessfullyParsed"])
  `catch` \e ->
     case e :: LexError of
       _ -> do
         putStrLn "lex error"
         return ["LexError"])
  `catch` \e ->
     case e :: ParseError Token AST of
       NotFoundAction _ state _ actTbl gotoTbl -> do
         candidates <- compCandidates [] state actTbl gotoTbl -- return ["candidates"]
         putStrLn (show candidates)
         return (map candidateToStr candidates)
       NotFoundGoto state _ _ actTbl gotoTbl -> do
         candidates <- compCandidates [] state actTbl gotoTbl
         putStrLn (show candidates)
         return (map candidateToStr candidates)

candidateToStr [] = ""
candidateToStr (TerminalSymbol s:cands)    = s ++ candidateToStr cands
candidateToStr (NonterminalSymbol _:cands) = "..." ++ candidateToStr cands


-- The normal parser
doProcess text = do
  putStrLn "Lexing..."
  terminalList <- lexing lexerSpec text
  mapM_ (putStrLn . terminalToString) terminalList
  putStrLn "Parsing..."
  exprSeqAst <- parsing parserSpec terminalList
  putStrLn "Pretty Printing..."
  putStrLn (show exprSeqAst)
  
  
readline msg = do
  putStr msg
  hFlush stdout
  readline'

readline' = do
  ch <- getChar
  if ch == '\n' then
    return ""
  else
    do line <- readline'
       return (ch:line)