Skip to content

Commit 6561be8

Browse files
committed
Assignment and variable parsing
1 parent 21440e7 commit 6561be8

File tree

3 files changed

+56
-47
lines changed

3 files changed

+56
-47
lines changed

shell.nix

Lines changed: 1 addition & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -6,22 +6,9 @@ pkgs.mkShell {
66
rustfmt
77
clippy
88
just
9-
kube3d
109
openssl
1110
pkgconfig
12-
python310Packages.ipython
13-
protobuf
14-
kustomize
15-
kubectl
16-
operator-sdk
17-
postgresql
18-
s3cmd
19-
minio-client
20-
argo
21-
python310Packages.mlflow
22-
kubernetes-helm
23-
grpcurl
24-
sass
11+
rust-analyzer
2512
];
2613

2714
# Certain Rust tools won't work without this

src/main.rs

Lines changed: 50 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,70 +1,91 @@
1-
use pest::Parser;
1+
use pest::{iterators::Pair, Parser};
22
use pest_derive::{self, Parser};
33

44
#[derive(Parser)]
55
#[grammar = "typed_script.pest"]
66
struct TSParser;
77

8+
#[derive(Debug)]
89
pub enum TSExpression {
9-
Value(TSValue)
10+
Value(TSValue),
1011
}
1112

13+
#[derive(Debug)]
1214
pub enum TSValue {
13-
String,
14-
Number,
15-
Boolean,
15+
String(String),
16+
Variable(String),
17+
Number,
18+
Boolean,
1619
}
1720

21+
#[derive(Debug)]
1822
pub enum TSType {
1923
String,
2024
Number,
21-
Boolean
25+
Boolean,
2226
}
2327

28+
#[derive(Debug)]
2429
pub struct TSIdentifier(String);
2530

31+
#[derive(Debug)]
2632
pub enum TSAST {
2733
Value(TSValue),
2834
Expression(TSExpression),
29-
Assignment(TSIdentifier, TSExpression)
35+
Assignment(TSIdentifier, TSExpression),
3036
}
3137

38+
#[derive(Debug)]
3239
pub enum TypedAst {
3340
Value(TSValue, TSType),
34-
Expression(TSExpression, TSType),
35-
Assignment(TSIdentifier, TSExpression, TSType)
41+
Expression(TSExpression),
42+
Assignment(TSIdentifier, TSExpression),
3643
}
3744

38-
3945
fn main() {
40-
let parsed_res = TSParser::parse(Rule::program, "let myvar = \"test\";").unwrap();
41-
42-
let mut ast: Vec<TSAST> = vec![];
43-
44-
for rule in parsed_res{
45-
match rule.as_rule(){
46-
Rule::program => println!("{}", rule),
47-
Rule::expression => println!("{}", rule),
48-
Rule::assignment => println!("{}", rule),
49-
_ => println!("{}", rule)
50-
}
46+
let parsed_res = TSParser::parse(Rule::program, "let myvar = \"test\"; myvar").unwrap();
47+
48+
let mut ast: Vec<TypedAst> = vec![];
49+
50+
for rule in parsed_res {
51+
let node = match rule.as_rule() {
52+
Rule::program => todo!(),
53+
Rule::expression => TypedAst::Expression(parse_expression(rule).unwrap()),
54+
Rule::assignment => parse_assignment(rule).unwrap(),
55+
_ => continue,
56+
};
57+
58+
ast.push(node);
5159
}
5260

61+
println!("ast {:?}", ast);
5362
}
5463

55-
fn parse_assignment(assignment: Rule::assignment) -> Result<TAST, Box<dyn std::error::Error>> {
56-
64+
fn parse_assignment(assignment: Pair<Rule>) -> Result<TypedAst, Box<dyn std::error::Error>> {
5765
let mut inner_rules = assignment.into_inner();
5866

59-
inner_rules.next();
60-
6167
let identifier = inner_rules.next().unwrap();
62-
63-
inner_rules.next();
6468

6569
let expression = inner_rules.next().unwrap();
6670

67-
println!("id: {identifier}, exp: {expression} ");
71+
let expression = parse_expression(expression);
72+
73+
let assignment = TypedAst::Assignment(
74+
TSIdentifier(identifier.as_str().into()),
75+
expression.unwrap(),
76+
);
77+
78+
Ok(assignment)
79+
}
80+
81+
fn parse_expression(expression: Pair<Rule>) -> Result<TSExpression, Box<dyn std::error::Error>> {
82+
let mut inner_rules = expression.into_inner().next().unwrap();
83+
84+
let typed_exp = match inner_rules.as_rule() {
85+
Rule::string => TSExpression::Value(TSValue::String(inner_rules.as_str().into())),
86+
Rule::identifier => TSExpression::Value(TSValue::Variable(inner_rules.as_str().into())),
87+
_ => todo!(),
88+
};
6889

69-
todo!()
90+
Ok(typed_exp)
7091
}

src/typed_script.pest

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,18 @@
11
number = { ASCII_DIGIT+ }
22

3+
WHITESPACE = _{ " " }
34
string = { "\"" ~ inner ~ "\"" }
45

56
identifier = {
67
ASCII_ALPHA+
78
}
89

9-
assignment = { "let " ~ identifier ~ " = " ~ expression ~ ";" }
10+
assignment = { "let " ~ identifier ~ "=" ~ expression }
1011

1112
inner = @{ char* }
1213

1314
expression = {
14-
number | string
15+
number | string | identifier
1516
}
1617

1718
char = {
@@ -20,7 +21,7 @@ char = {
2021
| "\\" ~ ("u" ~ ASCII_HEX_DIGIT{4})
2122
}
2223

23-
stmt = _{ expression | assignment }
24+
stmt = _{ assignment | expression }
2425

25-
program = _{ SOI ~ "\n"* ~ (stmt ~ "\n"+) * ~ stmt? ~ EOI }
26+
program = _{ SOI ~ "\n"* ~ (stmt ~ ";") * ~ stmt? ~ EOI }
2627

0 commit comments

Comments
 (0)