@@ -5,6 +5,7 @@ import Text.Parsec.String (Parser)
55import Text.Parsec.Combinator
66import Text.Parsec.Char
77import Text.Parsec
8+ import qualified Text.Parsec.Token as Tok
89import AST
910
1011-- literalParser :: Type -> Parser Literal
@@ -28,11 +29,13 @@ import AST
2829-- spaces
2930-- return $ Command exp
3031
32+
33+
3134exprParser :: Parser Expr
3235exprParser = 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+
137196mainTest = 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