Guest User

Untitled

a guest
Jan 12th, 2018
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.15 KB | None | 0 0
  1. // a = 1;
  2. // b = 2;
  3. // c(i) = i * 5;
  4. // d = c(a) / c(b);
  5.  
  6. // non_whitespace_and_not_eq|whitespace?|eq|whitespace?|expression
  7. // not_eq!("!")
  8. // take_until_either("=")
  9.  
  10. // named!(tag_length_value<(u8, &[u8])>,
  11. // do_parse!(
  12. // tag!( &[ 42u8 ][..] ) >>
  13. // length: be_u8 >>
  14. // bytes: take!(length) >>
  15. // (length, bytes)
  16. // )
  17. // );
  18.  
  19. #![feature(slice_patterns)]
  20.  
  21. #[macro_use]
  22. extern crate nom;
  23.  
  24. //use std::io::{stdin, Read};
  25. use std::{num, string};
  26. use nom::{is_space, is_digit};
  27.  
  28. #[derive(Debug, Clone)]
  29. enum Statement {
  30. Assignment(Assignment)
  31. }
  32.  
  33. #[derive(Debug, Clone)]
  34. struct Assignment {
  35. name: String,
  36. expression: Expression
  37. }
  38.  
  39. fn new_assignment(name: &[u8], expression: Expression) -> Assignment {
  40. Assignment{
  41. name: to_str(name).unwrap(),
  42. expression: expression
  43. }
  44. }
  45.  
  46. #[derive(Debug, Clone)]
  47. struct Expression {
  48. first_operand: Operand,
  49. operations: Vec<(Operator, Operand)>
  50. }
  51.  
  52. fn new_expression((first_operand, operations): (Operand, Vec<(Operator, Operand)>)) -> Expression {
  53. Expression {
  54. first_operand: first_operand,
  55. operations: operations
  56. }
  57. }
  58.  
  59. #[derive(Debug, Clone, Copy)]
  60. enum Operator {
  61. Add,
  62. Subtract,
  63. Multiply,
  64. Divide
  65. }
  66.  
  67. #[derive(Debug, Clone)]
  68. enum Operand {
  69. U64(u64),
  70. FunctionApplication(String, Vec<Expression>)
  71. }
  72.  
  73. fn to_str(u8s: &[u8]) -> Result<String, string::FromUtf8Error> {
  74. String::from_utf8(u8s.to_vec())
  75. }
  76.  
  77. fn to_u64(u8s: &[u8]) -> Result<u64, num::ParseIntError> {
  78. to_str(u8s).unwrap().parse()
  79. }
  80.  
  81. named!(statements<&[u8], Vec<Statement>>,
  82. many0!(call!(statement)));
  83. named!(statement<&[u8], Statement>,
  84. alt_complete!(
  85. map!(assignment, Statement::Assignment)));
  86.  
  87. named!(assignment<&[u8], Assignment>,
  88. do_parse!(
  89. name: call!(variable_name) >>
  90. ws!(tag!("=")) >>
  91. expression: call!(expression) >>
  92. ws!(tag!(";")) >>
  93. (new_assignment(name, expression))));
  94.  
  95. named!(variable_name<&[u8], &[u8]>,
  96. take_till!(|b: u8| is_space(b) || b == b'='));
  97.  
  98. named!(function_name<&[u8], &[u8]>,
  99. take_till!(|b: u8| is_space(b) || b == b'('));
  100.  
  101. named!(expressions<&[u8], Vec<Expression>>,
  102. separated_list!(tag!(","), call!(expression)));
  103. named!(expression<&[u8], Expression>,
  104. map!(
  105. pair!(
  106. call!(operand),
  107. many0!(pair!(
  108. ws!(call!(operator)),
  109. call!(operand)))),
  110. new_expression));
  111.  
  112. named!(operator<&[u8], Operator>,
  113. map!(one_of!("+-*/"), |o| match o {
  114. '+' => Operator::Add,
  115. '-' => Operator::Subtract,
  116. '*' => Operator::Multiply,
  117. '/' => Operator::Divide,
  118. _ => unreachable!()
  119. }));
  120.  
  121. named!(operand<&[u8], Operand>,
  122. alt_complete!(
  123. map!(u64, Operand::U64) |
  124. map!(function_application, |(a, b)| Operand::FunctionApplication(a, b))));
  125.  
  126. named!(u64<&[u8], u64>,
  127. map!(take_while1!(is_digit), |i| to_u64(i).unwrap()));
  128.  
  129. named!(function_application<&[u8], (String, Vec<Expression>)>,
  130. do_parse!(
  131. name: call!(function_name) >>
  132. tag!("(") >>
  133. expressions: call!(expressions) >>
  134. tag!(")") >>
  135. (to_str(name).unwrap(), expressions)));
  136.  
  137. named!(end<&[u8], &[u8]>,
  138. alt_complete!(tag!("a") | eof!()));
  139.  
  140. fn main() {
  141. println!("end {:?}", end(b""));
  142.  
  143. println!("name {:?}", variable_name(b"a"));
  144. println!("name {:?}", variable_name(b"abc"));
  145. println!("name {:?}", variable_name(b"abc "));
  146. println!("name {:?}", variable_name(b"abc="));
  147. println!("name {:?}", variable_name(b"abc ="));
  148.  
  149. println!("expression {:?}", expression(b"123456"));
  150. println!("expression {:?}", expression(b"1;"));
  151. println!("expression {:?}", expression(b"123;"));
  152. println!("expression {:?}", expression(b"1+4+7;"));
  153. println!("expression {:?}", expression(b"1 + 4 + 7;"));
  154. println!("expression {:?}", expression(b"3 + 6 + 9 ;"));
  155. println!("expression {:?}", expression(b"1 + 3 * 6 / 9;"));
  156.  
  157. println!("assignment {:?}", assignment(b"a=1;"));
  158. println!("assignment {:?}", assignment(b"a = 1;"));
  159. println!("assignment {:?}", assignment(b"a = 1 + 3 * 6 / 9;"));
  160.  
  161. println!("statement {:?}", statement(b"a = 1 + 3 * 6 / 9;"));
  162.  
  163. println!("statements {:?}", statements(b"a = 1 + 3 * 6 / 9;\nb = 5 * 3;"));
  164. println!("statements {:?}", statements(b"a = 1 + 3 * 6 / 9;\nb = 5 * "));
  165. println!("statements {:?}", statements(b"a = 1 + 3 * 6 / 9;\nb = 5 * a(5 * 3) + 5;"));
  166. }
Add Comment
Please, Sign In to add comment