Removed unnecessary uses of try from Parser

This provides a reasonable performance enhancement as backtracking occurs
less.

Signed-off-by: Collin J. Doering <collin.doering@rekahsoft.ca>
This commit is contained in:
Collin J. Doering 2015-07-06 04:46:12 -04:00
parent ce38a50ee7
commit c2c930de9d
1 changed files with 64 additions and 44 deletions

View File

@ -80,60 +80,80 @@ aInstr = do
-- | TODO: Documentation
cInstrDest :: GenParser Char st (Label, String)
cInstrDest = choice [ try (string "AMD") >> return ("AMD", "111")
, try (string "AD") >> return ("AD", "110")
, try (string "AM") >> return ("AM", "101")
, try (string "MD") >> return ("MD", "011")
, char 'A' >> return ("A", "100")
, char 'D' >> return ("D", "010")
, char 'M' >> return ("M", "001") ]
cInstrDest =
choice [ char 'D' >> return ("D", "010")
, char 'M' >>
choice [ char 'D' >> return ("MD", "011")
, return ("M", "001") ]
, char 'A' >>
choice [ char 'D' >> return ("AD", "110")
, char 'M' >>
choice [ char 'D' >> return ("AMD", "111")
, return ("AM", "101") ]
, return ("A", "100") ]]
-- | TODO: Documentation
cInstrJump :: GenParser Char st (Label, String)
cInstrJump = char 'J' >>
choice [ string "MP" >> return ("JMP", "111")
, try (string "LE") >> return ("JLE", "110")
, string "LT" >> return ("JLT", "100")
, string "NE" >> return ("JNE", "101")
, string "EQ" >> return ("JEQ", "010")
, try (string "GE") >> return ("JGE", "011")
, string "GT" >> return ("JGT", "001") ]
choice [ string "MP" >> return ("JMP", "111")
, string "NE" >> return ("JNE", "101")
, string "EQ" >> return ("JEQ", "010")
, char 'L' >>
choice [ char 'E' >> return ("JLE", "110")
, char 'T' >> return ("JLT", "100") ]
, char 'G' >>
choice [ char 'E' >> return ("JGE", "011")
, char 'T' >> return ("JGT", "001") ]
]
-- | TODO: Documentation
cInstrAluOps :: GenParser Char st (Label, String)
cInstrAluOps = choice [ char '0' >> return ("0", "0101010")
, char '1' >> return ("1", "0111111")
, try (string "-1") >> return ("-1", "0111010")
, try (string "-D") >> return ("-D", "0001111")
, try (string "-A") >> return ("-A", "0110011")
, string "-M" >> return ("-M", "1110011")
cInstrAluOps =
choice [ char '0' >> return ("0", "0101010")
, char '1' >> return ("1", "0111111")
, try (string "D+1") >> return ("D+1", "0011111")
, try (string "D-1") >> return ("D-1", "0001110")
, try (string "D+A") >> return ("D+A", "0000010")
, try (string "D-A") >> return ("D-A", "0010011")
, try (string "D&A") >> return ("D&A", "0000000")
, try (string "D|A") >> return ("D|A", "0010101")
, try (string "D+M") >> return ("D+M", "1000010")
, try (string "D-M") >> return ("D-M", "1010011")
, try (string "D&M") >> return ("D&M", "1000000")
, try (string "D|M") >> return ("D|M", "1010101")
, char 'D' >> return ("D", "0001100")
, try (string "!D") >> return ("!D", "0001101")
, try (string "!A") >> return ("!A", "0110001")
, string "!M" >> return ("!M", "1110001")
, char '-' >>
choice [ char '1' >> return ("-1", "0111010")
, char 'D' >> return ("-D", "0001111")
, char 'A' >> return ("-A", "0110011")
, char 'M' >> return ("-M", "1110011") ]
, try (string "A+1") >> return ("A+1", "0110111")
, try (string "A-1") >> return ("A-1", "0110010")
, try (string "A-D") >> return ("A-D", "0000111")
, char 'A' >> return ("A", "0110000")
, char '!' >>
choice [ char 'D' >> return ("!D", "0001101")
, char 'A' >> return ("!A", "0110001")
, char 'M' >> return ("!M", "1110001") ]
, try (string "M+1") >> return ("M+1", "1110111")
, try (string "M-1") >> return ("M-1", "1110010")
, try (string "M-D") >> return ("M-D", "1000111")
, char 'M' >> return ("M", "1110000") ]
, char 'A' >>
choice [ string "+1" >> return ("A+1", "0110111")
, char '-' >>
choice [ char '1' >> return ("A-1", "0110010")
, char 'D' >> return ("A-D", "0000111") ]
, return ("A", "0110000") ]
, char 'M' >>
choice [ string "+1" >> return ("M+1", "1110111")
, char '-' >>
choice [ char '1' >> return ("M-1", "1110010")
, char 'D' >> return ("M-D", "1000111") ]
, return ("M", "1110000") ]
, char 'D' >>
choice [ char '+' >>
choice [ char '1' >> return ("D+1", "0011111")
, char 'A' >> return ("D+A", "0000010")
, char 'M' >> return ("D+M", "1000010") ]
, char '-' >>
choice [ char '1' >> return ("D-1", "0001110")
, char 'A' >> return ("D-A", "0010011")
, char 'M' >> return ("D-M", "1010011") ]
, char '&' >>
choice [ char 'A' >> return ("D&A", "0000000")
, char 'M' >> return ("D&M", "1000000") ]
, char '|' >>
choice [ char 'A' >> return ("D|A", "0010101")
, char 'M' >> return ("D|M", "1010101") ]
, return ("D", "0001100")]
]
-- | TODO: Documentation
cInstrNoJump :: GenParser Char st Instruction