Expand description
ยง๐ ๏ธ C++ Parser Developer Guide
Cpp support for the Oak language framework.
This guide is designed to help you quickly get started with developing and integrating oak-cpp.
ยง๐ฆ Quick Start
ยงBasic Parsing Example
The following is a standard workflow for parsing a C++ class:
use oak_cpp::{CppParser, language::CppLanguage};
use oak_core::{SourceText, parser::Parser, source::TextEdit, parser::ParseSession};
fn main() {
// 1. Prepare source code
let code = r#"
#include <vector>
namespace core {
class Vector {
public:
void push(int value) {
data.push_back(value);
}
private:
std::vector<int> data;
};
}
"#;
let source = SourceText::new(code);
// 2. Initialize parser
let config = CppLanguage::default();
let parser = CppParser::new(&config);
let mut cache = ParseSession::default();
// 3. Execute parsing
let result = parser.parse(&source, &[], &mut cache);
// 4. Handle results
if result.diagnostics.is_empty() {
println!("Parsing successful!");
} else {
eprintln!("Errors found during parsing.");
}
}ยง๐ Core API Usage
ยง1. Syntax Tree Traversal
After a successful parse, you can use the built-in visitor pattern or manually traverse the Green/Red Tree to extract C++ constructs like class definitions, template parameters, or namespace hierarchies.
ยง2. Incremental Parsing
No need to re-parse the entire translation unit when small changes occur:
use oak_cpp::{CppParser, language::CppLanguage};
use oak_core::{SourceText, parser::Parser, source::TextEdit, parser::ParseSession};
fn main() {
// Initial parsing
let code = r#"
class Vector {
void push(int value) {}
};
"#;
let source = SourceText::new(code);
let config = CppLanguage::default();
let parser = CppParser::new(&config);
let mut cache = ParseSession::default();
let old_result = parser.parse(&source, &[], &mut cache);
// Updated code
let new_code = r#"
class Vector {
void push(int value) {
data.push_back(value);
}
};
"#;
let new_source = SourceText::new(new_code);
// Re-parsing (simplified example)
let new_result = parser.parse(&new_source, &[], &mut cache);
}ยง3. Diagnostics
oak-cpp provides rich error contexts specifically tailored for C++ developers, handling complex error scenarios like template instantiation failures:
use oak_cpp::{CppParser, language::CppLanguage};
use oak_core::{SourceText, parser::Parser, source::TextEdit, parser::ParseSession};
fn main() {
let code = r#"
class Vector {
void push(int value) {
return;
}
};
"#;
let source = SourceText::new(code);
let config = CppLanguage::default();
let parser = CppParser::new(&config);
let mut cache = ParseSession::default();
let result = parser.parse(&source, &[], &mut cache);
for error in &result.diagnostics {
println!("Error: {}", error);
}
}ยง๐๏ธ Architecture Overview
- Lexer: Tokenizes C++ source text into a stream of tokens, handling keywords, operators, and literals, including support for modern C++ features.
- Parser: Syntax analyzer based on the Pratt parsing algorithm to handle complex C++ expression precedence, operator overloading, and template syntax.
- AST: A strongly-typed syntax abstraction layer designed for high-performance C++ analysis tools.
ยง๐ Advanced Resources
Re-exportsยง
pub use crate::ast::CppRoot;pub use crate::builder::CppBuilder;pub use crate::language::CppLanguage;pub use crate::lexer::CppLexer;pub use crate::parser::CppParser;pub use lexer::token_type::CppTokenType;pub use parser::element_type::CppElementType;