Add number literal building to build.rs.

This commit is contained in:
Jesse Brault 2025-05-16 19:38:53 -05:00
parent 17285e84eb
commit bae2048aef

View File

@ -1,6 +1,7 @@
use crate::ast::*;
use crate::parser::Rule;
use pest::iterators::{Pair, Pairs};
use std::str::FromStr;
fn expect_and_use<T>(
file_id: usize,
@ -1227,7 +1228,27 @@ fn build_literal(file_id: usize, literal_pair: Pair<Rule>) -> Literal {
}
fn build_number_literal(file_id: usize, pair: Pair<Rule>) -> Literal {
todo!()
let inner_pair = pair.into_inner().next().unwrap();
match inner_pair.as_rule() {
Rule::DoubleLiteral => build_double_literal(file_id, inner_pair),
Rule::LongLiteral => build_long_literal(file_id, inner_pair),
Rule::IntLiteral => build_int_literal(file_id, inner_pair),
_ => unreachable!(),
}
}
fn build_double_literal(file_id: usize, inner_pair: Pair<Rule>) -> Literal {
Literal::Double(f64::from_str(&inner_pair.as_str()).unwrap())
}
fn build_long_literal(file_id: usize, inner_pair: Pair<Rule>) -> Literal {
let as_string = inner_pair.as_str();
let without_el = &as_string[0..(as_string.len() - 1)];
Literal::Long(i64::from_str(without_el).unwrap())
}
fn build_int_literal(file_id: usize, inner_pair: Pair<Rule>) -> Literal {
Literal::Integer(i32::from_str(&inner_pair.as_str()).unwrap())
}
fn build_string_literal(file_id: usize, pair: Pair<Rule>) -> Literal {
@ -1265,15 +1286,16 @@ fn build_backtick_string(file_id: usize, pair: Pair<Rule>) -> Literal {
#[cfg(test)]
mod tests {
use super::*;
use crate::ast::pretty_print::PrettyPrint;
use crate::parser::DeimosParser;
use indoc::indoc;
fn assert_builds(src: &str) {
fn assert_builds(src: &str) -> CompilationUnit {
let parse_result = DeimosParser::parse(Rule::CompilationUnit, src);
if let Err(e) = parse_result {
panic!("Parsing failed.\n{}", e)
} else {
build_ast(0, parse_result.unwrap().next().unwrap());
build_ast(0, parse_result.unwrap().next().unwrap())
}
}
@ -1283,15 +1305,30 @@ mod tests {
fn main() {
let x = foo[a];
}
"})
"});
}
#[test]
fn object_index_and_call() {
assert_builds(indoc! {"\
assert_builds(indoc! {"
fn main() {
a[b]().c()
}
"})
"});
}
#[test]
fn int_literal() {
assert_builds("fn main() { 0 }");
}
#[test]
fn long_literal() {
assert_builds("fn main() { 1L }");
}
#[test]
fn double_literal() {
assert_builds("fn main() { 1.0 }");
}
}