Tidier original name handling; slightly better errors

This commit is contained in:
Adam Sampson 2007-04-05 11:21:32 +00:00
parent 9fd0ea58a1
commit 0bf57b0222
4 changed files with 32 additions and 26 deletions

View File

@ -16,7 +16,8 @@ data NameType =
data Name = Name {
nameMeta :: Meta,
nameType :: NameType,
nameName :: String
nameName :: String,
nameOrigName :: String
}
deriving (Show, Eq, Typeable, Data)

View File

@ -218,11 +218,11 @@ sWHILE = reserved "WHILE"
-- XXX could handle VALOF by translating each step to one { and matching multiple ones?
mainMarker = "__main"
sMainMarker = do { whiteSpace; reserved mainMarker }
sMainMarker = do { whiteSpace; reserved mainMarker } <?> "end of input (top-level process)"
indent = do { whiteSpace; reserved indentMarker }
outdent = do { whiteSpace; reserved outdentMarker }
eol = do { whiteSpace; reserved eolMarker }
indent = do { whiteSpace; reserved indentMarker } <?> "indentation increase"
outdent = do { whiteSpace; reserved outdentMarker } <?> "indentation decrease"
eol = do { whiteSpace; reserved eolMarker } <?> "end of line"
--}}}
--{{{ helper functions
@ -276,29 +276,28 @@ sepBy1NE item sep
findName :: A.Name -> OccParser A.Name
findName thisN
= do st <- getState
ni <- case lookup (A.nameName thisN) (localNames st) of
Nothing -> fail $ "name " ++ A.nameName thisN ++ " not defined"
Just ni -> return ni
let origN = originalDef ni
origN <- case lookup (A.nameName thisN) (localNames st) of
Nothing -> fail $ "name " ++ A.nameName thisN ++ " not defined"
Just n -> return n
if A.nameType thisN /= A.nameType origN
then fail $ "expected " ++ show (A.nameType thisN) ++ " (" ++ A.nameName origN ++ " is " ++ show (A.nameType origN) ++ ")"
else return $ thisN { A.nameName = A.nameName origN }
else return $ thisN { A.nameName = A.nameName origN,
A.nameOrigName = A.nameName thisN }
scopeIn :: A.Name -> OccParser A.Name
scopeIn n@(A.Name m nt s)
scopeIn n@(A.Name m nt s os)
= do st <- getState
let s' = s ++ "_" ++ (show $ nameCounter st)
let n' = A.Name m nt s'
let ni = NameInfo { originalDef = n, mappedName = s' }
let n' = n { A.nameName = s', A.nameOrigName = s }
setState $ st {
nameCounter = (nameCounter st) + 1,
localNames = (s, ni) : (localNames st),
names = (s', ni) : (names st)
localNames = (s, n') : (localNames st),
names = (s', n') : (names st)
}
return n'
scopeOut :: A.Name -> OccParser ()
scopeOut n@(A.Name m nt s)
scopeOut n@(A.Name m nt s os)
= do st <- getState
let lns' = case localNames st of
(s, _):ns -> ns
@ -345,7 +344,7 @@ anyName :: A.NameType -> OccParser A.Name
anyName nt
= do m <- md
s <- identifier
return $ A.Name m nt s
return $ A.Name m nt s s
<?> show nt
name :: A.NameType -> OccParser A.Name

View File

@ -6,15 +6,9 @@ import Data.Generics
import qualified AST as A
data NameInfo = NameInfo {
originalDef :: A.Name,
mappedName :: String
}
deriving (Show, Eq, Typeable, Data)
data ParseState = ParseState {
localNames :: [(String, NameInfo)],
names :: [(String, NameInfo)],
localNames :: [(String, A.Name)],
names :: [(String, A.Name)],
nameCounter :: Int
}
deriving (Show, Eq, Typeable, Data)

View File

@ -1,11 +1,23 @@
-- CO516 q7: Adam Sampson <ats1> vim:et:ts=2:foldmethod=marker
-- Dining Frogger^WPhilosophers
-- This will be a lot more readable in a folding editor (I use VIM).
-- Tiny text version.
-- Standalone version.
--{{{ stuff from the standard library
--#INCLUDE "consts.inc"
--#USE "course.lib"
VAL BYTE ESCAPE IS 27:
PROC out.int (VAL INT n, w, CHAN OF BYTE out)
STOP
:
INT, INT FUNCTION random (VAL INT range, seed) IS 0, 0:
PROC copy.string ([]BYTE dest, VAL []BYTE src)
STOP
:
PROC make.string ([]BYTE dest, VAL INT len)
STOP
:
--}}}
--{{{ Constants