| Crates.io | oak-tcl |
| lib.rs | oak-tcl |
| version | 0.0.1 |
| created_at | 2025-10-22 04:32:27.155785+00 |
| updated_at | 2026-01-23 05:20:04.190479+00 |
| description | Tcl language parser with support for scripting, command substitution, and procedural programming features. |
| homepage | https://github.com/ygg-lang/oaks |
| repository | https://github.com/ygg-lang/oaks |
| max_upload_size | |
| id | 1894945 |
| size | 112,687 |
A high-performance Tcl parser for Rust, built with the Oak parser combinator framework. Parse Tool Command Language scripts with comprehensive AST generation and error handling.
Oak Tcl provides robust parsing capabilities for Tcl script files, supporting commands, procedures, control structures, and all major Tcl constructs. Built on the Oak parser combinator framework, it delivers excellent performance and detailed error messages.
use oak_core::{Parser, SourceText, parser::session::ParseSession};
use oak_tcl::{TclParser, TclLanguage};
fn main() {
let mut session = ParseSession::<TclLanguage>::default();
let parser = TclParser::new();
let source = SourceText::new(r#"
set name "World"
puts "Hello, $name!"
set numbers {1 2 3 4 5}
set sum 0
foreach num $numbers {
set sum [expr {$sum + $num}]
}
puts "Sum: $sum"
"#);
let result = parser.parse(&source, &[], &mut session);
}
use oak_core::{Parser, SourceText, parser::session::ParseSession};
use oak_tcl::{TclParser, TclLanguage};
fn main() {
let mut session = ParseSession::<TclLanguage>::default();
let parser = TclParser::new();
let source = SourceText::new(r#"
proc factorial {n} {
if {$n <= 1} {
return 1
} else {
return [expr {$n * [factorial [expr {$n - 1}]]}]
}
}
proc greet {name {greeting "Hello"}} {
return "$greeting, $name!"
}
puts [factorial 5]
puts [greet "World"]
puts [greet "World" "Hi"]
"#);
let result = parser.parse(&source, &[], &mut session);
}
Oak Tcl supports parsing complex list operations:
use oak_core::{Parser, SourceText, parser::session::ParseSession};
use oak_tcl::{TclParser, TclLanguage};
let mut session = ParseSession::<TclLanguage>::default();
let parser = TclParser::new();
let source = SourceText::new(r#"
set my_list {apple banana cherry}
set first [lindex $my_list 0]
set last [lindex $my_list end]
array set my_array {
key1 value1
key2 value2
}
"#);
let result = parser.parse(&source, &[], &mut session);
Parse regexp operations:
let source = r#"
set text "Hello World 123"
set pattern {\d+}
if {[regexp $pattern $text match]} {
puts "Found number: $match"
}
set result [regsub $pattern $text "XXX"]
puts "Modified: $result"
"#;
The parser generates a rich AST with the following main node types:
TclFile - Root node containing the entire fileCommand - Tcl commands with argumentsProcedure - Procedure definitions with parameters and bodyVariable - Variable references and assignmentsExpression - Expressions in square bracketsList - List literals and operationsControlFlow - if, while, for, foreach statementsString - String literals with interpolationOak Tcl is designed for high performance:
Oak Tcl integrates seamlessly with the Oak ecosystem:
use oak::{Parser, Language};
use oak_tcl::TclLanguage;
// Use with other Oak parsers
let mut parser = Parser::<TclLanguage>::new();
let result = parser.parse(tcl_source);
More examples can be found in the examples directory:
We welcome contributions! Please see our Contributing Guide for details.