update
This commit is contained in:
+3
-3
@@ -20,12 +20,12 @@ pub enum TokenType {
|
|||||||
#[derive(Clone)]
|
#[derive(Clone)]
|
||||||
pub struct Token {
|
pub struct Token {
|
||||||
pub token_type: TokenType,
|
pub token_type: TokenType,
|
||||||
pub token_value: Vec<String>
|
pub token_values: Vec<String>
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a> fmt::Debug for Token {
|
impl<'a> fmt::Debug for Token {
|
||||||
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||||
write!(f, "(TokenType: {:?}, TokenValue: {})", self.token_type, self.token_value.join(", "))
|
write!(f, "(TokenType: {:?}, TokenValue: {})", self.token_type, self.token_values.join(", "))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -91,7 +91,7 @@ pub fn lex(mut code: &str, use_whitespace: bool) -> Vec<Token> {
|
|||||||
if (!use_whitespace && s.token_type!=TokenType::Whitespace) || use_whitespace {
|
if (!use_whitespace && s.token_type!=TokenType::Whitespace) || use_whitespace {
|
||||||
tokens.push(Token {
|
tokens.push(Token {
|
||||||
token_type: s.token_type,
|
token_type: s.token_type,
|
||||||
token_value: vcaps,
|
token_values: vcaps,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
+6
-5
@@ -4,16 +4,17 @@ mod parser;
|
|||||||
use parser::parse;
|
use parser::parse;
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
let input = "int main() {";
|
let input = "int main() {}";
|
||||||
|
println!("\n\n\n\n");
|
||||||
// let input = "test->xy";
|
// let input = "test->xy";
|
||||||
let mut tokens = lex(input, false);
|
let mut tokens = lex(input, false);
|
||||||
let ast = *parse(&mut tokens);
|
let ast = *parse(&mut tokens);
|
||||||
for t in tokens {
|
// for t in tokens {
|
||||||
println!("{:?}", t);
|
// println!("{:?}", t);
|
||||||
}
|
// }
|
||||||
let mut _x = 1;
|
let mut _x = 1;
|
||||||
for a in ast {
|
for a in ast {
|
||||||
println!("{:?}: {:?}", a.type_, a.values);
|
println!("{:?}: {:?}\n", a.type_, a.values);
|
||||||
_x+=1;
|
_x+=1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+14
-2
@@ -4,7 +4,8 @@ use std::fmt;
|
|||||||
|
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Debug, Clone)]
|
||||||
pub enum AstTypes {
|
pub enum AstTypes {
|
||||||
FunctionDecleration
|
FunctionDecleration,
|
||||||
|
Other
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct Ast {
|
pub struct Ast {
|
||||||
@@ -22,7 +23,8 @@ impl<'a> fmt::Debug for Ast {
|
|||||||
pub enum AstDef {
|
pub enum AstDef {
|
||||||
Normal(TokenType),
|
Normal(TokenType),
|
||||||
Repeated(TokenType),
|
Repeated(TokenType),
|
||||||
Optional(TokenType)
|
Optional(TokenType),
|
||||||
|
Else
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct PNode {
|
pub struct PNode {
|
||||||
@@ -40,6 +42,10 @@ pub fn parse(tokens: &mut Vec<Token>) -> Box<Vec<Ast>> {
|
|||||||
ast_type: AstTypes::FunctionDecleration,
|
ast_type: AstTypes::FunctionDecleration,
|
||||||
ast_match: vec![AstDef::Normal(TokenType::Keyword)]
|
ast_match: vec![AstDef::Normal(TokenType::Keyword)]
|
||||||
},
|
},
|
||||||
|
PNode {
|
||||||
|
ast_type: AstTypes::Other,
|
||||||
|
ast_match: vec![AstDef::Else]
|
||||||
|
},
|
||||||
];
|
];
|
||||||
let tokens_len = tokens.len();
|
let tokens_len = tokens.len();
|
||||||
let mut ast: Vec<Ast> = Vec::new();
|
let mut ast: Vec<Ast> = Vec::new();
|
||||||
@@ -62,8 +68,14 @@ pub fn parse(tokens: &mut Vec<Token>) -> Box<Vec<Ast>> {
|
|||||||
is_match = true;
|
is_match = true;
|
||||||
} else {
|
} else {
|
||||||
is_match = false;
|
is_match = false;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
AstDef::Else => {
|
||||||
|
matched.push(tokens[i].clone());
|
||||||
|
tokens.drain(0..1);
|
||||||
|
is_match = true;
|
||||||
|
}
|
||||||
_ => {}
|
_ => {}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user