Skip to content

Commit 446787b

Browse files
committed
Added more functionality to Parser
1 parent c6083ae commit 446787b

File tree

1 file changed

+65
-6
lines changed

1 file changed

+65
-6
lines changed

src/Parser.hs

Lines changed: 65 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import Text.Parsec.String (Parser)
55
import Text.Parsec.Combinator
66
import Text.Parsec.Char
77
import Text.Parsec
8+
import qualified Text.Parsec.Token as Tok
89
import AST
910

1011
-- literalParser :: Type -> Parser Literal
@@ -28,11 +29,13 @@ import AST
2829
-- spaces
2930
-- return $ Command exp
3031

32+
33+
3134
exprParser :: Parser Expr
3235
exprParser = literalStmtParser
33-
-- <|> funcCallParser
34-
-- <|> literalParser
35-
-- <|> parens exprParser
36+
<|> declarationStmtParser
37+
<|> funcCallStmtParser
38+
<|> (Tok.parens lexer exprParser)
3639

3740
-- declStmtParser :: Parser Expr
3841
-- declStmtParser = do
@@ -93,8 +96,8 @@ vListParser = nameParser `sepBy1` (spaces >> (char ',') >> spaces)
9396

9497
-- ArgList : Type Name[, ArgList] ----------
9598
-- NSS
96-
argListParer :: Parser ArgList
97-
argListParer = unit `sepBy1` (spaces >> (char ',') >> spaces)
99+
argListParser :: Parser ArgList
100+
argListParser = unit `sepBy1` (spaces >> (char ',') >> spaces)
98101
where unit = do
99102
tp <- typeParser
100103
name <- nameParser
@@ -110,6 +113,8 @@ argsParser = exprParser `sepBy1` (spaces >> (char ',') >> spaces)
110113
-- delim :: Parser ()
111114
-- delim p = (spaces >> (char p) >> spaces)
112115

116+
117+
113118
---------------------------------------------------
114119
-- | LiteralStmt : StrLiteral | IntLiteral
115120
-- NSS
@@ -132,15 +137,69 @@ intLiteralP = do
132137
return (IntLiteral res)
133138
-----------------------------------------------------
134139

140+
141+
-- | Function Call Statement
142+
funcCallStmtParser :: Parser Expr
143+
funcCallStmtParser = do
144+
res <- funcCallParser
145+
return $ FuncCallStmt res
146+
147+
funcCallParser :: Parser FuncCall
148+
funcCallParser = callParser {-<|> binOpCall-}
149+
150+
callParser :: Parser FuncCall
151+
callParser = do
152+
callee <- nameParser
153+
(spaces >> (char '(') >> spaces)
154+
args <- argsParser
155+
(spaces >> (char ')') >> spaces)
156+
return $ Call callee args
157+
158+
159+
160+
-------------------------------------------------------
161+
-- | Declaration Stuff
162+
163+
declarationStmtParser :: Parser Expr
164+
declarationStmtParser = do
165+
res <- declarationParser
166+
return $ DeclarationStmt res
167+
168+
169+
declarationParser :: Parser Declaration
170+
declarationParser = externDeclParser <|> varDeclParser
171+
172+
externDeclParser :: Parser Declaration
173+
externDeclParser = do
174+
reserved "extern"
175+
spaces
176+
fname <- nameParser
177+
(spaces >> (char '(') >> spaces)
178+
argList <- argListParser
179+
(spaces >> (char ')') >> spaces >> (char ':') >> spaces)
180+
retT <- typeParser
181+
return $ ExternDecl fname argList retT
182+
183+
184+
varDeclParser :: Parser Declaration
185+
varDeclParser = do
186+
t <- typeParser
187+
spaces
188+
names <- vListParser
189+
return $ VarDecl t names
190+
191+
---------------------------------------------------------
192+
135193
-- funcCallParser :: Parser
136194

195+
137196
mainTest = do
138197
str <- getLine
139198
if str == "quit"
140199
then
141200
return ()
142201
else do
143-
print (parse argListParer "sdf" str)
202+
print (parse exprParser "sdf" str)
144203
mainTest
145204

146205

0 commit comments

Comments
 (0)