Guest User

Untitled

a guest
Nov 13th, 2018
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.47 KB | None | 0 0
  1. extern crate nom;
  2. use nom::{space, digit, char};
  3.  
  4. named!(consume_whitespace, take_while!(is_space));
  5. named!(take_line, take_while!(is_not_line_end));
  6.  
  7. named!(pub oper_register_gp <Operand>,
  8. do_parse!(
  9. opt!(complete!(consume_whitespace)) >>
  10. alt!(char!('v') | char!('V') ) >>
  11. num: digit >>
  12. opt!(complete!(char!(','))) >>
  13. opt!(complete!(char!('\n'))) >>
  14. (Operand::RegisterGP(from_dec(str::from_utf8(num).unwrap()).unwrap() as usize))
  15. )
  16. );
  17.  
  18. named!(pub oper_register_dt <Operand>,
  19. do_parse!(
  20. opt!(complete!(consume_whitespace)) >>
  21. tag_no_case!("dt") >>
  22. opt!(complete!(char!(','))) >>
  23. opt!(complete!(consume_whitespace)) >>
  24. (Operand::RegisterDT)
  25. )
  26. );
  27.  
  28. named!(pub oper_register_st <Operand>,
  29. do_parse!(
  30. opt!(complete!(consume_whitespace)) >>
  31. tag_no_case!("st") >>
  32. opt!(complete!(char!(','))) >>
  33. opt!(complete!(consume_whitespace)) >>
  34. (Operand::RegisterDT)
  35. )
  36. );
  37.  
  38. named!(pub oper_register_i <Operand>,
  39. do_parse!(
  40. opt!(complete!(consume_whitespace)) >>
  41. alt!(char!('i') | char!('I')) >>
  42. opt!(complete!(char!(','))) >>
  43. opt!(complete!(char!('\n'))) >>
  44. (Operand::RegisterI)
  45. )
  46. );
  47.  
  48. named!(pub parse_operand <Operand>,
  49. alt_complete!(oper_register_gp | oper_register_i)
  50. );
  51.  
  52. named!(pub parse_operands <Vec<Operand> >,
  53. // Getting a 0 length Vec back is fine as some operations do not take
  54. // operands
  55. fold_many0!(parse_operand, Vec::new(), |mut acc: Vec<_>, item| {
  56. acc.push(item);
  57. acc
  58. }));
  59.  
  60. named!(pub parse_mnemonic<Mnemonic>,
  61. alt_complete!(
  62. tag_no_case!("add") => { |_| Mnemonic::Add } |
  63. tag_no_case!("and") => { |_| Mnemonic::And } |
  64. tag_no_case!("call") => { |_| Mnemonic::Call } |
  65. tag_no_case!("cls") => { |_| Mnemonic::Cls } |
  66. tag_no_case!("draw") => { |_| Mnemonic::Draw } |
  67. tag_no_case!("jmp") => { |_| Mnemonic::Jmp } |
  68. tag_no_case!("ldb") => { |_| Mnemonic::Ldb } |
  69. tag_no_case!("ld") => { |_| Mnemonic::Ld } |
  70. tag_no_case!("or") => { |_| Mnemonic::Or } |
  71. tag_no_case!("ret") => { |_| Mnemonic::Ret } |
  72. tag_no_case!("rnd") => { |_| Mnemonic::Rnd } |
  73. tag_no_case!("seq") => { |_| Mnemonic::Seq } |
  74. tag_no_case!("shl") => { |_| Mnemonic::Shl } |
  75. tag_no_case!("shr") => { |_| Mnemonic::Shr } |
  76. tag_no_case!("sne") => { |_| Mnemonic::Sne } |
  77. tag_no_case!("snp") => { |_| Mnemonic::Snp } |
  78. tag_no_case!("sp") => { |_| Mnemonic::Sp } |
  79. tag_no_case!("sub") => { |_| Mnemonic::Sub } |
  80. tag_no_case!("subn") => { |_| Mnemonic::Subn } |
  81. tag_no_case!("sys") => { |_| Mnemonic::Sys } |
  82. tag_no_case!("wk") => { |_| Mnemonic::Wk } |
  83. tag_no_case!("xor") => { |_| Mnemonic::Xor } |
  84. take_while!(is_not_space) => { |_| Mnemonic::Undefined }
  85. )
  86. );
  87.  
  88. named!(pub parse_line<Instruction>,
  89. do_parse!(
  90. mnemonic: parse_mnemonic >>
  91. operands: parse_operands >>
  92. (Instruction { mnemonic: mnemonic,
  93. operands: operands})
  94. )
  95. );
  96.  
  97. fn main() {
  98. println!("Hello, world!");
  99. }
Add Comment
Please, Sign In to add comment