generated from ElnuDev/rust-project
Add comment parsing
This commit is contained in:
parent
359c46d776
commit
46acbce60e
7 changed files with 40 additions and 30 deletions
8
.vscode/settings.json
vendored
8
.vscode/settings.json
vendored
|
@ -1,5 +1,11 @@
|
||||||
{
|
{
|
||||||
"rust-analyzer.linkedProjects": [
|
"rust-analyzer.linkedProjects": [
|
||||||
"./demo/Cargo.toml"
|
"./demo/Cargo.toml"
|
||||||
]
|
],
|
||||||
|
"files.exclude": {
|
||||||
|
"**/*.rpyc": true,
|
||||||
|
"**/*.rpa": true,
|
||||||
|
"**/*.rpymc": true,
|
||||||
|
"**/cache/": true
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -1,5 +0,0 @@
|
||||||
65279,1179403647,1463895090
|
|
||||||
3.1415927,2.7182817,1.618034
|
|
||||||
-40,-273.15
|
|
||||||
13,42
|
|
||||||
65537
|
|
|
9
demo/demo.rpy
Normal file
9
demo/demo.rpy
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
show black amogus # this is a comment
|
||||||
|
# this is a full line comment
|
||||||
|
what the heck
|
||||||
|
"this is a string with a # comment"
|
||||||
|
"this is a string over
|
||||||
|
multiple lines"
|
||||||
|
this is cool # comment
|
||||||
|
|
||||||
|
huh
|
|
@ -1,5 +1,5 @@
|
||||||
use renrs;
|
use renrs;
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
renrs::parse("demo.csv");
|
renrs::parse("demo.rpy");
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,9 +0,0 @@
|
||||||
// + indicates one or more times
|
|
||||||
field = { (ASCII_DIGIT | "." | "-")+ }
|
|
||||||
// ~ indicates directly followed by
|
|
||||||
// * indicates zero or more times (optional)
|
|
||||||
record = { field ~ ("," ~ field)* }
|
|
||||||
// SOI - start of input
|
|
||||||
// END - end of input
|
|
||||||
// There may be trailing newlines at the end
|
|
||||||
file = { SOI ~ (record ~ ("\r\n" | "\n"))* ~ "\n"* ~ EOI }
|
|
20
src/lib.rs
20
src/lib.rs
|
@ -4,32 +4,24 @@ use pest::Parser;
|
||||||
use pest_derive::Parser;
|
use pest_derive::Parser;
|
||||||
|
|
||||||
#[derive(Parser)]
|
#[derive(Parser)]
|
||||||
#[grammar = "csv.pest"]
|
#[grammar = "rpy.pest"]
|
||||||
struct CSVParser;
|
struct RpyParser;
|
||||||
|
|
||||||
pub fn parse(file_path: &str) {
|
pub fn parse(file_path: &str) {
|
||||||
let unparsed_file = fs::read_to_string(file_path).expect("cannot find file");
|
let unparsed_file = fs::read_to_string(file_path).expect("cannot find file");
|
||||||
let file = CSVParser::parse(Rule::file, &unparsed_file)
|
let file = RpyParser::parse(Rule::file, &unparsed_file)
|
||||||
.expect("unsuccessful parse") // unwrap the parse result
|
.expect("unsuccessful parse") // unwrap the parse result
|
||||||
.next().unwrap(); // get and unwrap the `file` rule; never fails
|
.next().unwrap(); // get and unwrap the `file` rule; never fails
|
||||||
|
|
||||||
let mut field_sum = 0.0;
|
|
||||||
let mut record_count: u64 = 0;
|
|
||||||
|
|
||||||
for record in file.into_inner() {
|
for record in file.into_inner() {
|
||||||
match record.as_rule() {
|
match record.as_rule() {
|
||||||
Rule::record => {
|
Rule::line => {
|
||||||
record_count += 1;
|
for field in record.into_inner().map(|pairs| pairs.as_str()) {
|
||||||
|
println!("'{field}'");
|
||||||
for field in record.into_inner() {
|
|
||||||
field_sum += field.as_str().parse::<f64>().unwrap();
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
Rule::EOI => (),
|
Rule::EOI => (),
|
||||||
_ => unreachable!(),
|
_ => unreachable!(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
println!("Sum of fields: {field_sum}");
|
|
||||||
println!("Number of records: {record_count}");
|
|
||||||
}
|
}
|
||||||
|
|
17
src/rpy.pest
Normal file
17
src/rpy.pest
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
// underscores mark are silent rules, are ignored
|
||||||
|
WHITESPACE = _{ " " }
|
||||||
|
|
||||||
|
// characters are anything but newlines
|
||||||
|
char = { !NEWLINE ~ ANY }
|
||||||
|
|
||||||
|
// comments are a # followed by
|
||||||
|
// any number of non-newline characters
|
||||||
|
COMMENT = _{ "#" ~ char* }
|
||||||
|
|
||||||
|
// statements are comprised of at least one character
|
||||||
|
statement = { char+ }
|
||||||
|
|
||||||
|
// lines are comprised of a statement
|
||||||
|
line = { statement }
|
||||||
|
|
||||||
|
file = { SOI ~ (line ~ ("\r\n" | "\n")*)* ~ "\n"* ~ EOI }
|
Loading…
Add table
Reference in a new issue