MCPcopy Create free account
hub / github.com/PerroEngine/Perro / next_token

Method next_token

perro_source/runtime_project/perro_scene/src/lexer.rs:64–144  ·  view source on GitHub ↗
(&mut self)

Source from the content-addressed store, hash-verified

62 self.span.start, self.span.end
63 )
64 }
65}
66
67impl std::error::Error for LexError {}
68
69impl LexError {
70 fn new(kind: LexErrorKind, start: usize, end: usize) -> Self {
71 Self {
72 kind,
73 span: Span { start, end },
74 }
75 }
76}
77
78pub struct Lexer<'a> {
79 src: &'a str,
80 pos: usize,
81}
82
83impl<'a> Lexer<'a> {
84 pub fn new(src: &'a str) -> Self {
85 Self { src, pos: 0 }
86 }
87
88 fn peek(&self) -> Option<char> {
89 self.src[self.pos..].chars().next()
90 }
91
92 fn bump(&mut self) -> Option<char> {
93 let c = self.peek()?;
94 self.pos += c.len_utf8();
95 Some(c)
96 }
97
98 fn skip_ws(&mut self) {
99 while matches!(self.peek(), Some(c) if c.is_whitespace()) {
100 self.bump();
101 }
102 }
103
104 fn skip_until_newline(&mut self) {
105 while let Some(c) = self.peek() {
106 if c == '\n' || c == '\r' {
107 break;
108 }
109 self.bump();
110 }
111 }
112
113 pub fn next_token(&mut self) -> Token<'a> {
114 loop {
115 self.skip_ws();
116 match (self.peek(), self.src[self.pos..].chars().nth(1)) {
117 (Some('#'), _) => {
118 self.bump();
119 self.skip_until_newline();
120 }
121 (Some('/'), Some('/')) => {

Callers 4

newMethod · 0.80
advanceMethod · 0.80
newMethod · 0.80
advanceMethod · 0.80

Calls 6

NumberEnum · 0.85
peekMethod · 0.80
skip_until_newlineMethod · 0.80
skip_wsMethod · 0.45
bumpMethod · 0.45
pushMethod · 0.45

Tested by

no test coverage detected