aidl initial work

This commit is contained in:
Able 2023-05-04 02:27:04 -05:00
parent 10d4c4c32c
commit 6a94aa3e84
10 changed files with 162 additions and 0 deletions

7
Cargo.lock generated
View file

@ -31,6 +31,13 @@ dependencies = [
"version_check",
]
[[package]]
name = "aidl"
version = "0.1.0"
dependencies = [
"logos 0.13.0",
]
[[package]]
name = "anyhow"
version = "1.0.66"

View file

@ -32,6 +32,7 @@ members = [
"libraries/uri",
"libraries/versioning",
"programs/aidl",
"programs/ari_client",
"programs/ari_server",
"programs/axel2wat",

9
programs/aidl/Cargo.toml Normal file
View file

@ -0,0 +1,9 @@
[package]
name = "aidl"
version = "0.1.0"
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
logos = "0.13.0"

3
programs/aidl/README.md Normal file
View file

@ -0,0 +1,3 @@
### Inspirations
- [FIDL](https://fuchsia.dev/fuchsia-src/concepts/fidl/overview)
- [rtps-idl](https://crates.io/crates/rtps-idl)

22
programs/aidl/SPEC.md Normal file
View file

@ -0,0 +1,22 @@
The example implementation will be in rust
IDL | Rust
__________
boolean | bool
I8 | i8
I16 | i16
I32 | i32
I64 | i64
U8 | u8
U16 | u16
U32 | u32
U64 | u64
F32 | f32
F64 | f64
Constant X Y Z | const X: Y = Z;
Type | type
Vector<X> | Vec<X>
Array[X;Y] | [X;Y]
Function X accepts(YX) returns(ZX) | fn X(YX) -> ZX

View file

@ -0,0 +1,20 @@
Type Byte = U8;
Type String = Vector<Byte>;
Enumurate Boolean{
False = 0,
True = 1,
}
Union Option<T>{
None,
Some<T>
}
Structure Version {
major: Byte,
minor: Byte,
patch: Byte,
};

View file

@ -0,0 +1,13 @@
Type UUID = Array[U8; 16];
Type Nanoseconds = U32;
Structure Duration{
secs: U64,
nanos: Nanoseconds,
}
Structure LinkedList{
data: Any,
child: Option<LinkedList>,
}

View file

@ -0,0 +1 @@
Type Byte = U8;

View file

@ -0,0 +1,24 @@
// core provides lots of useful types like String and Byte
use core;
Constant VERSION Version{
major: 1,
minor: 0,
patch: 0,
}
Type Path = String;
Structure File {
name: String,
data: Vector<Byte>,
}
Interface File{
function new accepts(Path) returns(None);
// Open in this iteration assumes the file exists
function open accepts(Path) returns(File);
function close accepts(File) returns(None);
}

62
programs/aidl/src/main.rs Normal file
View file

@ -0,0 +1,62 @@
use logos::Logos;
#[derive(Logos, Debug, PartialEq)]
#[logos(skip r"[ \t\n\f]+")] // Ignore this regex pattern between tokens
enum Token {
#[token("{")]
LeftBrace,
#[token("}")]
RightBrace,
#[token("(")]
LeftParen,
#[token(")")]
RightParen,
#[token(";")]
Semicolon,
#[token(":")]
Colon,
#[token("<")]
LeftArrow,
#[token(">")]
RightArrow,
#[token(",")]
Comma,
#[token("=")]
Equals,
#[regex(r#"[A-z]+"#, |lex| lex.slice().parse().ok())]
Literal(String),
#[regex("use [a-zA-Z/]+;", |lex| lex.slice().parse().ok())]
Component(String),
#[regex("U[0-9]+", |lex| lex.slice().parse().ok())]
UnsignedType(String),
#[regex("I[0-9]+", |lex| lex.slice().parse().ok())]
SignedType(String),
#[regex(r"//[ a-zA-Z!-+]+", |lex| lex.slice().parse().ok())]
Comment(String),
}
fn main() {
let mut lex = Token::lexer(include_str!("../../../programs/aidl/assets/vfs.idl"));
for token in lex {
// let ok_token = token.ok();
// if ok_token.is_some() {
// println!("{:?}", ok_token.unwrap());
// }
println!("{:?}", token);
}
}