Advertisement
Guest User

Untitled

a guest
Sep 25th, 2017
96
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Rust 1.45 KB | None | 0 0
  1. extern crate memmap;
  2. use std::{str, process};
  3. use memmap::{Mmap, Protection};
  4.  
  5. #[derive(Debug, Default, Clone, Copy)]
  6. struct LexerT<'a> {
  7.    pos: usize,
  8.    text: &'a str,
  9.     token: &'a str,
  10. }
  11.  
  12. fn next_token(state: LexerT) -> Option<LexerT> {
  13.    let mut start_pos = 0;
  14.    let mut end_pos = start_pos;
  15.    let ref slice = state.text[state.pos .. state.text.len()];
  16.  
  17.    for ch in slice.chars() {  
  18.         if (ch < 'A' || ch > 'Z')
  19.         && (ch < 'a' || ch > 'z') {
  20.             if start_pos == end_pos {
  21.                 if ch != ' ' {
  22.                     end_pos += 1;
  23.                     break;
  24.                 } else {
  25.                     start_pos += 1;
  26.                     end_pos += 1;
  27.                     continue;
  28.                 }
  29.             }
  30.  
  31.             break;
  32.         } else {
  33.             end_pos += 1;
  34.         }
  35.    }
  36.    
  37.    if start_pos != end_pos {
  38.        Some(LexerT {pos: end_pos, text: slice, token: &slice[start_pos..end_pos]})
  39.    } else {
  40.        None
  41.    }
  42. }
  43.  
  44. fn main() {
  45.     let map = Mmap::open_path("data", Protection::Read).unwrap();
  46.     let memory = unsafe { map.as_slice() };
  47.    let string = str::from_utf8(memory).unwrap();
  48.    
  49.    let mut lexer = LexerT {pos: 0, text: string, token: ""};
  50.    let mut cnt_word = 0;
  51.    let mut cnt_point = 0;
  52.    while let Some(lexer_now) = next_token(lexer) {        
  53.        lexer = lexer_now;
  54.        if lexer.token.chars().nth(0).unwrap() == ',' {
  55.             cnt_point = cnt_point + 1;
  56.         } else {
  57.             cnt_word = cnt_word + 1;
  58.         }
  59.    }
  60.    
  61.    println!("Итого: {} слов, и {} запятых",cnt_word,cnt_point);
  62. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement