summaryrefslogtreecommitdiff
path: root/projects/10/JackParser.hs
diff options
context:
space:
mode:
Diffstat (limited to 'projects/10/JackParser.hs')
-rw-r--r--projects/10/JackParser.hs26
1 files changed, 26 insertions, 0 deletions
diff --git a/projects/10/JackParser.hs b/projects/10/JackParser.hs
new file mode 100644
index 0000000..a6fe7b3
--- /dev/null
+++ b/projects/10/JackParser.hs
@@ -0,0 +1,26 @@
+-- Jack Parser, as the coursework of Project 10 of Nand2Tetris course.
+-- Author: Yuchen Pei
+data JClass = JClass JIdentifier [JClassVarDec] [JSubroutineDec]
+data JIdentifier = JIdentifier [Char]
+data JClassVarDec = JClassVarDec JClassVarScope JType JIdentifier
+data JClassVarScope = JStatic | JField
+data JType = JInt | JChar | JBoolean | JVoid
+data JSubroutineDec = JSubroutineDec JSubroutineType JType JIdentifier [JParameter] JSubroutineBody
+data JSubroutineType = JConstructor | JFunction | JMethod
+data JParameter = JParameter JType JIdentifier
+data JSubroutineBody = JSubroutineBody [JVarDec] [JStatement]
+data JVarDec = JVarDec JType JIdentifier
+data JStatement = JLetStatement | JIfStatement | JWhileStatment | JDoStatement | JReturnStatement
+data JLetStatement = JLetStatment JLeftVarId JExpression
+data JIfStatement = JIfStatement JExpression [JStatement] (Maybe [JStatement])
+data JWhileStatment = JWhileStatment JExpression [JStatement]
+type JDoStatement = JSubroutineCall
+type JReturnStatement = Maybe JExpression
+data JExpression = JTerm [(JOp, JTerm)]
+data JTerm = JIntConst | JStrConst | JKeywordConst | JLeftVarId | JSubroutineCall | JExpression | JUnaryOpTerm
+data JLeftVarId = JIdentifier | JLeftVarId JIdentifier (Maybe JExpression)
+data JSubroutineCall = JSubroutineCall Identifier [JExpression] | JSubroutineCall Identifier Identifier [JExpression]
+type JOp = Char
+data JUnaryOpTerm = JUnaryOpTerm JUnaryOp Term
+type JUnaryOp = Char
+data JKeywordConst = JTrue | JFalse | JNull | JThis