mod lexer;
pub use lexer::{Lexeme, lex};
mod parser;
pub use parser::{Parse, ParseError, parse};
pub mod ast;
mod lowering;
pub use lowering::{
FableError, FableField, FableFieldBoolUnary, FableFieldMut, FableFieldMutUnary,
FableFieldStringUnary, FableFloatUnary, FableIntrinsics, FablePlan, FableRootAccess,
FableRootPlan, FableRootSpec, FableRootValue, FableSignedUnary, FableStringBinaryPredicate,
FableStringUnary, FableTransformPlan, FableUnsignedUnary, apply, apply_with_intrinsics,
transform, transform_with_intrinsics,
};
pub type ResolvedNode = cstree::syntax::ResolvedNode<SyntaxKind>;
pub type ResolvedToken = cstree::syntax::ResolvedToken<SyntaxKind>;
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, cstree::Syntax)]
#[repr(u32)]
pub enum SyntaxKind {
Whitespace,
Comment,
Ident,
Int,
Float,
Str,
#[static_text("true")]
True,
#[static_text("false")]
False,
#[static_text("null")]
Null,
#[static_text("if")]
IfKw,
#[static_text("else")]
ElseKw,
#[static_text("let")]
LetKw,
#[static_text("and")]
AndKw,
#[static_text("or")]
OrKw,
#[static_text("not")]
NotKw,
#[static_text(".")]
Dot,
#[static_text(",")]
Comma,
#[static_text(":")]
Colon,
#[static_text(";")]
Semicolon,
#[static_text("(")]
LParen,
#[static_text(")")]
RParen,
#[static_text("[")]
LBracket,
#[static_text("]")]
RBracket,
#[static_text("{")]
LBrace,
#[static_text("}")]
RBrace,
#[static_text("=")]
Assign,
#[static_text("+")]
Plus,
#[static_text("-")]
Minus,
#[static_text("==")]
EqEq,
#[static_text("!=")]
Neq,
#[static_text("<")]
Lt,
#[static_text(">")]
Gt,
#[static_text("<=")]
Le,
#[static_text(">=")]
Ge,
Error,
Root,
Block,
AssignStmt,
LetStmt,
ExprStmt,
IfStmt,
ElseClause,
Literal,
VarRef,
FieldExpr,
IndexExpr,
StructLiteral,
StructField,
CallExpr,
ArgList,
Arg,
BinaryExpr,
UnaryExpr,
ParenExpr,
}
pub type SyntaxNode = cstree::syntax::SyntaxNode<SyntaxKind>;
pub type SyntaxToken = cstree::syntax::SyntaxToken<SyntaxKind>;
pub type SyntaxElement = cstree::syntax::SyntaxElement<SyntaxKind>;
impl SyntaxKind {
#[must_use]
pub fn is_token(self) -> bool {
self <= SyntaxKind::Error
}
#[must_use]
pub fn is_trivia(self) -> bool {
matches!(self, SyntaxKind::Whitespace | SyntaxKind::Comment)
}
}