Initial library commit.
This commit is contained in:
commit
14bd90d88e
17
.gitignore
vendored
Normal file
17
.gitignore
vendored
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
# Ignore swap files from text editors.
|
||||||
|
*.swp
|
||||||
|
|
||||||
|
# Ignore compiled files.
|
||||||
|
*.o
|
||||||
|
*.so
|
||||||
|
*.rlib
|
||||||
|
*.dll
|
||||||
|
*.exe
|
||||||
|
|
||||||
|
# Ignore files/directories generated by Cargo.
|
||||||
|
/target/
|
||||||
|
|
||||||
|
# Remove Cargo.lock from gitignore if creating an executable,
|
||||||
|
# leave it for libraries.
|
||||||
|
# More information here: http://doc.crates.io/guide.html#cargotoml-vs-cargolock
|
||||||
|
#Cargo.lock
|
4
Cargo.lock
generated
Normal file
4
Cargo.lock
generated
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
[root]
|
||||||
|
name = "draconic"
|
||||||
|
version = "0.1.0"
|
||||||
|
|
10
Cargo.toml
Normal file
10
Cargo.toml
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
[package]
|
||||||
|
name = "draconic"
|
||||||
|
version = "0.1.0"
|
||||||
|
authors = ["Jason Travis Smith <Myrddin@CyberMagesLLC.com>"]
|
||||||
|
description = "A parser/compiler/interpreter for the Dragonic language."
|
||||||
|
license = ""
|
||||||
|
repository = "https://gitlab.com/CyberMages/draconic.git"
|
||||||
|
documentation = ""
|
||||||
|
keywords = ["draconic", "parser", "interpreter", "compiler"]
|
||||||
|
|
42
examples/parse_test.rs
Normal file
42
examples/parse_test.rs
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
extern crate draconic;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
use std::path::PathBuf;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
///
|
||||||
|
pub const RESOURCE_DIR: &'static str = "resources";
|
||||||
|
|
||||||
|
///
|
||||||
|
pub const EXAMPLES_DIR: &'static str = "examples";
|
||||||
|
|
||||||
|
///
|
||||||
|
pub const TEST_INPUT_FILENAME: &'static str = "test.tpl";
|
||||||
|
|
||||||
|
///
|
||||||
|
pub const TEST_OUTPUT_FILENAME: &'static str = "test.rs";
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
///
|
||||||
|
pub fn main()
|
||||||
|
{
|
||||||
|
let mut input: PathBuf;
|
||||||
|
let mut output: PathBuf;
|
||||||
|
|
||||||
|
// Get the input file to test with. It is in the
|
||||||
|
// resources directory.
|
||||||
|
input = PathBuf::from(env!("CARGO_MANIFEST_DIR"));
|
||||||
|
input.push(RESOURCE_DIR);
|
||||||
|
input.push(TEST_INPUT_FILENAME);
|
||||||
|
|
||||||
|
// The output file created from compiling. It will be
|
||||||
|
// placed in the examples directory.
|
||||||
|
output = PathBuf::from(env!("CARGO_MANIFEST_DIR"));
|
||||||
|
output.push(EXAMPLES_DIR);
|
||||||
|
output.push(TEST_OUTPUT_FILENAME);
|
||||||
|
|
||||||
|
println!("Compiling {:?} to {:?}", input, output);
|
||||||
|
}
|
0
resources/test.pdt
Normal file
0
resources/test.pdt
Normal file
3
src/compiler.rs
Normal file
3
src/compiler.rs
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
pub enum Compiler
|
||||||
|
{
|
||||||
|
}
|
3
src/lexer.rs
Normal file
3
src/lexer.rs
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
pub enum Lexer
|
||||||
|
{
|
||||||
|
}
|
9
src/lib.rs
Normal file
9
src/lib.rs
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
mod compiler;
|
||||||
|
mod lexer;
|
||||||
|
mod parser;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
pub use self::compiler::Compiler;
|
||||||
|
pub use self::lexer::Lexer;
|
||||||
|
pub use self::parser::Parser;
|
65
src/parser.rs
Normal file
65
src/parser.rs
Normal file
@ -0,0 +1,65 @@
|
|||||||
|
///
|
||||||
|
pub struct Parser
|
||||||
|
{
|
||||||
|
///
|
||||||
|
position: usize,
|
||||||
|
|
||||||
|
///
|
||||||
|
input: String
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
impl Parser
|
||||||
|
{
|
||||||
|
///
|
||||||
|
pub fn parse(&mut self)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Get, but don't consume, the current character.
|
||||||
|
pub fn get_char(&self) -> char
|
||||||
|
{
|
||||||
|
'a'
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Returns true if the next set of characters starts with
|
||||||
|
/// the given pattern; Otherwise, false.
|
||||||
|
pub fn starts_with<P>(&self, pattern: P) -> bool
|
||||||
|
where P: AsRef<str>
|
||||||
|
{
|
||||||
|
self.position >= self.input.len()
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Returns true if all the input has been consumed;
|
||||||
|
/// Otherwise, false.
|
||||||
|
pub fn end_of_file(&self) -> bool
|
||||||
|
{
|
||||||
|
self.position >= self.input.len()
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Return the current character and advance to the next one.
|
||||||
|
pub fn consume_char(&mut self) -> char
|
||||||
|
{
|
||||||
|
'a'
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Consume and discard zero or more whitespace characters.
|
||||||
|
pub fn consume_whitespace(&mut self)
|
||||||
|
{
|
||||||
|
self.consume_while(Parser::is_whitespace);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Consume characters until the test returns false.
|
||||||
|
pub fn consume_while<F>(&mut self, test: F) -> String
|
||||||
|
where F: Fn(char) -> bool
|
||||||
|
{
|
||||||
|
String::new()
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Determines if a character is whitespace.
|
||||||
|
fn is_whitespace(c: char) -> bool
|
||||||
|
{
|
||||||
|
c.is_whitespace()
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user