Skip to content

Commit cb44ce9

Browse files
Merge pull request #497 from Alex-Fischman/sexp-parser
Make parser extensible
2 parents faeabbc + 5de4a0b commit cb44ce9

File tree

11 files changed

+402
-532
lines changed

11 files changed

+402
-532
lines changed

Cargo.lock

Lines changed: 0 additions & 7 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,8 +53,6 @@ lazy_static = "1.4"
5353
num = "0.4.3"
5454
smallvec = "1.11"
5555

56-
generic_symbolic_expressions = "5.0.4"
57-
5856
egraph-serialize = { version = "0.2.0", default-features = false }
5957

6058
# binary dependencies

src/ast/desugar.rs

Lines changed: 25 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,12 @@ use crate::*;
66
/// makes rules into a SSA-like format (see [`NormFact`]).
77
pub(crate) fn desugar_program(
88
program: Vec<Command>,
9-
symbol_gen: &mut SymbolGen,
9+
parser: &mut Parser,
1010
seminaive_transform: bool,
1111
) -> Result<Vec<NCommand>, Error> {
1212
let mut res = vec![];
1313
for command in program {
14-
let desugared = desugar_command(command, symbol_gen, seminaive_transform)?;
14+
let desugared = desugar_command(command, parser, seminaive_transform)?;
1515
res.extend(desugared);
1616
}
1717
Ok(res)
@@ -22,7 +22,7 @@ pub(crate) fn desugar_program(
2222
/// makes rules into a SSA-like format (see [`NormFact`]).
2323
pub(crate) fn desugar_command(
2424
command: Command,
25-
symbol_gen: &mut SymbolGen,
25+
parser: &mut Parser,
2626
seminaive_transform: bool,
2727
) -> Result<Vec<NCommand>, Error> {
2828
let res = match command {
@@ -102,28 +102,28 @@ pub(crate) fn desugar_command(
102102

103103
res
104104
}
105-
Command::Rewrite(ruleset, rewrite, subsume) => {
106-
desugar_rewrite(ruleset, rewrite_name(&rewrite).into(), &rewrite, subsume)
105+
Command::Rewrite(ruleset, ref rewrite, subsume) => {
106+
desugar_rewrite(ruleset, rule_name(&command), rewrite, subsume)
107107
}
108-
Command::BiRewrite(ruleset, rewrite) => {
109-
desugar_birewrite(ruleset, rewrite_name(&rewrite).into(), &rewrite)
108+
Command::BiRewrite(ruleset, ref rewrite) => {
109+
desugar_birewrite(ruleset, rule_name(&command), rewrite)
110110
}
111111
Command::Include(span, file) => {
112112
let s = std::fs::read_to_string(&file)
113113
.unwrap_or_else(|_| panic!("{span} Failed to read file {file}"));
114114
return desugar_program(
115-
parse_program(Some(file), &s)?,
116-
symbol_gen,
115+
parse_program(Some(file), &s, parser)?,
116+
parser,
117117
seminaive_transform,
118118
);
119119
}
120120
Command::Rule {
121121
ruleset,
122122
mut name,
123-
rule,
123+
ref rule,
124124
} => {
125125
if name == "".into() {
126-
name = rule.to_string().replace('\"', "'").into();
126+
name = rule_name(&command);
127127
}
128128

129129
let result = vec![NCommand::NormRule {
@@ -144,7 +144,7 @@ pub(crate) fn desugar_command(
144144
span,
145145
expr,
146146
schedule,
147-
} => desugar_simplify(&expr, &schedule, span, symbol_gen),
147+
} => desugar_simplify(&expr, &schedule, span, parser),
148148
Command::RunSchedule(sched) => {
149149
vec![NCommand::RunSchedule(sched.clone())]
150150
}
@@ -171,9 +171,9 @@ pub(crate) fn desugar_command(
171171
// ((extract {fresh} {variants}))
172172
// :ruleset {fresh_ruleset})
173173
// (run {fresh_ruleset} 1)
174-
let fresh = symbol_gen.fresh(&"desugar_qextract_var".into());
175-
let fresh_ruleset = symbol_gen.fresh(&"desugar_qextract_ruleset".into());
176-
let fresh_rulename = symbol_gen.fresh(&"desugar_qextract_rulename".into());
174+
let fresh = parser.symbol_gen.fresh(&"desugar_qextract_var".into());
175+
let fresh_ruleset = parser.symbol_gen.fresh(&"desugar_qextract_ruleset".into());
176+
let fresh_rulename = parser.symbol_gen.fresh(&"desugar_qextract_rulename".into());
177177
let rule = Rule {
178178
span: span.clone(),
179179
body: vec![Fact::Eq(
@@ -218,7 +218,7 @@ pub(crate) fn desugar_command(
218218
vec![NCommand::Pop(span, num)]
219219
}
220220
Command::Fail(span, cmd) => {
221-
let mut desugared = desugar_command(*cmd, symbol_gen, seminaive_transform)?;
221+
let mut desugared = desugar_command(*cmd, parser, seminaive_transform)?;
222222

223223
let last = desugared.pop().unwrap();
224224
desugared.push(NCommand::Fail(span, Box::new(last)));
@@ -322,10 +322,10 @@ fn desugar_simplify(
322322
expr: &Expr,
323323
schedule: &Schedule,
324324
span: Span,
325-
symbol_gen: &mut SymbolGen,
325+
parser: &mut Parser,
326326
) -> Vec<NCommand> {
327327
let mut res = vec![NCommand::Push(1)];
328-
let lhs = symbol_gen.fresh(&"desugar_simplify".into());
328+
let lhs = parser.symbol_gen.fresh(&"desugar_simplify".into());
329329
res.push(NCommand::CoreAction(Action::Let(
330330
span.clone(),
331331
lhs,
@@ -339,7 +339,7 @@ fn desugar_simplify(
339339
variants: 0,
340340
expr: Expr::Var(span.clone(), lhs),
341341
},
342-
symbol_gen,
342+
parser,
343343
false,
344344
)
345345
.unwrap(),
@@ -349,6 +349,10 @@ fn desugar_simplify(
349349
res
350350
}
351351

352-
pub(crate) fn rewrite_name(rewrite: &Rewrite) -> String {
353-
rewrite.to_string().replace('\"', "'")
352+
pub fn rule_name<Head, Leaf>(command: &GenericCommand<Head, Leaf>) -> Symbol
353+
where
354+
Head: Clone + Display,
355+
Leaf: Clone + PartialEq + Eq + Hash + Display,
356+
{
357+
command.to_string().replace('\"', "'").into()
354358
}

src/ast/expr.rs

Lines changed: 8 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
use super::ToSexp;
21
use crate::{core::ResolvedCall, *};
32
use ordered_float::OrderedFloat;
43
use std::{fmt::Display, hash::Hasher};
@@ -97,12 +96,6 @@ impl Display for ResolvedVar {
9796
}
9897
}
9998

100-
impl ToSexp for ResolvedVar {
101-
fn to_sexp(&self) -> Sexp {
102-
Sexp::Symbol(self.name.to_string())
103-
}
104-
}
105-
10699
pub type Expr = GenericExpr<Symbol, Symbol>;
107100
/// A generated expression is an expression that is generated by the system
108101
/// and does not have annotations.
@@ -250,31 +243,18 @@ impl<Head: Clone + Display, Leaf: Hash + Clone + Display + Eq> GenericExpr<Head,
250243
}
251244
}
252245

253-
impl<Head: Display, Leaf: Display> GenericExpr<Head, Leaf> {
254-
/// Converts this expression into a
255-
/// s-expression (symbolic expression).
256-
/// Example: `(Add (Add 2 3) 4)`
257-
pub fn to_sexp(&self) -> Sexp {
258-
let res = match self {
259-
GenericExpr::Lit(_ann, lit) => Sexp::Symbol(lit.to_string()),
260-
GenericExpr::Var(_ann, v) => Sexp::Symbol(v.to_string()),
261-
GenericExpr::Call(_ann, op, children) => Sexp::List(
262-
vec![Sexp::Symbol(op.to_string())]
263-
.into_iter()
264-
.chain(children.iter().map(|c| c.to_sexp()))
265-
.collect(),
266-
),
267-
};
268-
res
269-
}
270-
}
271-
272246
impl<Head, Leaf> Display for GenericExpr<Head, Leaf>
273247
where
274248
Head: Display,
275249
Leaf: Display,
276250
{
277-
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
278-
write!(f, "{}", self.to_sexp())
251+
fn fmt(&self, f: &mut Formatter) -> std::fmt::Result {
252+
match self {
253+
GenericExpr::Lit(_ann, lit) => write!(f, "{lit}"),
254+
GenericExpr::Var(_ann, var) => write!(f, "{var}"),
255+
GenericExpr::Call(_ann, op, children) => {
256+
write!(f, "({} {})", op, ListDisplay(children, " "))
257+
}
258+
}
279259
}
280260
}

0 commit comments

Comments
 (0)