Skip to content
This repository was archived by the owner on Aug 21, 2025. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
117 changes: 1 addition & 116 deletions builder.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,122 +9,7 @@ const encoder = new TextEncoder();

export type Eventual<T> = () => T;

export class LazyBuilder {
builder: Builder = new Builder();

newCallExpr(
offset: number,
functionName: string,
args: Eventual<Expr>[],
): Eventual<Expr> {
return () =>
this.builder.newCallExpr(
offset,
functionName,
args.map((a) => a()),
);
}

newSelectExpr(
offset: number,
operand: Eventual<Expr>,
field: string,
): Eventual<Expr> {
return () => this.builder.newSelectExpr(offset, operand(), field);
}

newMemberCallExpr(
offset: number,
target: Eventual<Expr>,
functionName: string,
args: Eventual<Expr>[],
): Eventual<Expr> {
return () =>
this.builder.newMemberCallExpr(
offset,
target(),
functionName,
args.map((a) => a()),
);
}

newIdentExpr(offset: number, name: string): Eventual<Expr> {
return () => this.builder.newIdentExpr(offset, name);
}

newStructExpr(
offset: number,
entries: Eventual<Expr_CreateStruct_Entry>[],
messageName?: string,
): Eventual<Expr> {
return () =>
this.builder.newStructExpr(
offset,
entries.map((a) => a()),
messageName,
);
}

newListExpr(offset: number, elements: Eventual<Expr>[]): Eventual<Expr> {
return () =>
this.builder.newListExpr(
offset,
elements.map((a) => a()),
);
}

newStructEntry(
offset: number,
field: string,
value: Eventual<Expr>,
): Eventual<Expr_CreateStruct_Entry> {
return () => this.builder.newStructEntry(offset, field, value());
}

newMapEntry(
offset: number,
key: Eventual<Expr>,
value: Eventual<Expr>,
): Eventual<Expr_CreateStruct_Entry> {
return () => this.builder.newMapEntry(offset, key(), value());
}

newInt64Expr(offset: number, digits: string): Eventual<Expr> {
return () => this.builder.newInt64Expr(offset, digits);
}

newUnsignedInt64Expr(offset: number, digits: string): Eventual<Expr> {
return () => this.builder.newUnsignedInt64Expr(offset, digits);
}

newDoubleExpr(offset: number, digits: string): Eventual<Expr> {
return () => this.builder.newDoubleExpr(offset, digits);
}

newStringExpr(
offset: number,
sequence: (string | number[])[],
): Eventual<Expr> {
return () => this.builder.newStringExpr(offset, sequence);
}

newBytesExpr(
offset: number,
sequence: (string | number[])[],
): Eventual<Expr> {
return () => this.builder.newBytesExpr(offset, sequence);
}

newBoolExpr(offset: number, keyword: "true" | "false"): Eventual<Expr> {
return () => this.builder.newBoolExpr(offset, keyword);
}

newNullExpr(offset: number): Eventual<Expr> {
return () => this.builder.newNullExpr(offset);
}
}

class Builder {
export default class Builder {
#prevId = 0n;

sourceInfo: SourceInfo = {
Expand Down
39 changes: 19 additions & 20 deletions cel.peggy
Original file line number Diff line number Diff line change
Expand Up @@ -14,19 +14,16 @@

{{
import type { Expr, Expr_CreateStruct_Entry } from "./external/cel/expr/syntax_pb.ts";
import { LazyBuilder } from "./builder.ts";
import Builder from "./builder.ts";
import type { Eventual } from "./builder.ts";
const builder = new LazyBuilder();
const builder = new Builder();
}}

Entry
= expr:Expr { return expr(); }

Expr
= or:ConditionalOr S
tail:TernaryTail?
{
/* : Eventual<Expr> */
/* : Expr */
if (tail === null) {
return or;
} else {
Expand All @@ -37,14 +34,14 @@ Expr
TernaryTail
= "?" t:ConditionalOr S ":" f:Expr S
{
/* : [Eventual<Expr>, Eventual<Expr>] */
/* : [Expr, Expr] */
return [t, f];
}

ConditionalOr
= and:ConditionalAnd|1.., $(S "||")|
{
/* : Eventual<Expr> */
/* : Expr */
if (and.length === 1) {
return and[0];
} else {
Expand All @@ -55,7 +52,7 @@ ConditionalOr
ConditionalAnd
= relation:Relation|1.., $(S "&&")|
{
/* : Eventual<Expr> */
/* : Expr */
if (relation.length === 1) {
return relation[0];
} else {
Expand All @@ -66,7 +63,7 @@ ConditionalAnd
Relation
= addition:Addition tail:RelationTail?
{
/* : Eventual<Expr> */
/* : Expr */
if (tail === null) {
return addition;
} else {
Expand All @@ -77,7 +74,7 @@ Relation
RelationTail
= (
S operator:Relop nextExpr:Addition
{ return ((prevExpr: Eventual<Expr>) => builder.newCallExpr(offset(), operator, [prevExpr, nextExpr])) }
{ return ((prevExpr: Expr) => builder.newCallExpr(offset(), operator, [prevExpr, nextExpr])) }
)+

Relop "relational operator"
Expand All @@ -90,7 +87,7 @@ Relop "relational operator"
Addition
= multiplication:Multiplication tail:AdditionTail?
{
/* : Eventual<Expr> */
/* : Expr */
if (tail === null) {
return multiplication;
} else {
Expand All @@ -101,13 +98,13 @@ Addition
AdditionTail
= (
S operator:( o:[+-] { return `_${o}_` } ) nextExpr:Multiplication
{ return ((prevExpr: Eventual<Expr>) => builder.newCallExpr(offset(), operator, [prevExpr, nextExpr])) }
{ return ((prevExpr: Expr) => builder.newCallExpr(offset(), operator, [prevExpr, nextExpr])) }
)+

Multiplication
= unary:Unary tail:MultiplicationTail?
{
/* : Eventual<Expr> */
/* : Expr */
if (tail === null) {
return unary;
} else {
Expand All @@ -118,16 +115,18 @@ Multiplication
MultiplicationTail
= (
S operator:( o:[*/%] { return `_${o}_` } ) nextExpr:Unary
{ return ((prevExpr: Eventual<Expr>) => builder.newCallExpr(offset(), operator, [prevExpr, nextExpr])) }
{ return ((prevExpr: Expr) => builder.newCallExpr(offset(), operator, [prevExpr, nextExpr])) }
)+

Unary
= Member
/ S ops:$( "!"+ / "-"+ ) expr:Member
{
/* : Eventual<Expr> */
/* : Expr */
if (ops.length % 2 === 0) {
return expr;
} else if (expr.exprKind.case === "callExpr" && expr.exprKind.value.function === `${ops[0]}_`) {
return expr.exprKind.value.args[0];
} else {
return builder.newCallExpr(offset(), `${ops[0]}_`, [expr]);
}
Expand All @@ -136,7 +135,7 @@ Unary
Member
= S primary:Primary tail:MemberTail
{
/* : Eventual<Expr> */
/* : Expr */
if (tail.length === 0) {
return primary;
} else {
Expand All @@ -149,11 +148,11 @@ MemberTail

Access
= "." S field:Identifier S ![(]
{ return ((prevExpr: Eventual<Expr>) => builder.newSelectExpr(offset(), prevExpr, field)) }
{ return ((prevExpr: Expr) => builder.newSelectExpr(offset(), prevExpr, field)) }
/ "." S identifier:Identifier S "(" args:ExprList ")"
{ return ((prevExpr: Eventual<Expr>) => builder.newMemberCallExpr(offset(), prevExpr, identifier, args)) }
{ return ((prevExpr: Expr) => builder.newMemberCallExpr(offset(), prevExpr, identifier, args)) }
/ "[" index:Expr "]"
{ return ((prevExpr: Eventual<Expr>) => builder.newCallExpr(offset(), "_[_]", [prevExpr, index])) }
{ return ((prevExpr: Expr) => builder.newCallExpr(offset(), "_[_]", [prevExpr, index])) }

Primary
= Literal
Expand Down
Loading