Compare commits
No commits in common. "59165f623525cc4330f1f5ae46dab0a43ce8e014" and "e79c22db724024e7f47a87c40b0e38ee8682d306" have entirely different histories.
59165f6235
...
e79c22db72
@ -1,6 +1,5 @@
|
|||||||
use crate::spec::{
|
use crate::spec::{
|
||||||
BuildBooleanOn, ChildSpec, SingleBooleanChildToBuild, SingleChildToBuild,
|
BuildBooleanOn, ChildSpec, SingleChildToBuild, StructBuildSpec, VecChildToBuild,
|
||||||
SingleTypeChildToBuild, StructBuildSpec, VecChild, VecChildToBuild,
|
|
||||||
};
|
};
|
||||||
use convert_case::{Case, Casing};
|
use convert_case::{Case, Casing};
|
||||||
use proc_macro2::TokenStream;
|
use proc_macro2::TokenStream;
|
||||||
@ -10,45 +9,33 @@ pub fn make_build_fn_name(s: &str) -> String {
|
|||||||
format!("build_{}", s.to_case(Case::Snake))
|
format!("build_{}", s.to_case(Case::Snake))
|
||||||
}
|
}
|
||||||
|
|
||||||
fn make_vec_child_holder(vec_child: &VecChild) -> TokenStream {
|
fn make_child_holder(child_spec: &ChildSpec) -> Option<TokenStream> {
|
||||||
|
match child_spec {
|
||||||
|
ChildSpec::SkipChild(_) => None,
|
||||||
|
ChildSpec::VecChild(vec_child) => {
|
||||||
let (child_ident, child_type_ident) = match vec_child.build() {
|
let (child_ident, child_type_ident) = match vec_child.build() {
|
||||||
VecChildToBuild::Type(vec_type_child) => (
|
VecChildToBuild::Type(vec_type_child) => (
|
||||||
format_ident!("{}", vec_type_child.var_name()),
|
format_ident!("{}", vec_type_child.var_name()),
|
||||||
format_ident!("{}", vec_type_child.build()),
|
format_ident!("{}", vec_type_child.build()),
|
||||||
),
|
),
|
||||||
};
|
};
|
||||||
quote! {
|
Some(quote! {
|
||||||
let mut #child_ident: Vec<Box<#child_type_ident>> = vec![]
|
let mut #child_ident: Vec<#child_type_ident> = vec![]
|
||||||
|
})
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
fn make_single_type_child_holder(single_type_child: &SingleTypeChildToBuild) -> TokenStream {
|
|
||||||
let child_ident = format_ident!("{}", single_type_child.var_name());
|
|
||||||
let child_type_ident = format_ident!("{}", single_type_child.build());
|
|
||||||
quote! {
|
|
||||||
let mut #child_ident: Option<Box<#child_type_ident>> = None
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn make_single_boolean_child_holder(
|
|
||||||
single_boolean_child: &SingleBooleanChildToBuild,
|
|
||||||
) -> TokenStream {
|
|
||||||
let child_ident = format_ident!("{}", single_boolean_child.var_name());
|
|
||||||
quote! {
|
|
||||||
let mut #child_ident: bool = false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn make_child_holder(child_spec: &ChildSpec) -> Option<TokenStream> {
|
|
||||||
match child_spec {
|
|
||||||
ChildSpec::SkipChild(_) => None,
|
|
||||||
ChildSpec::VecChild(vec_child) => Some(make_vec_child_holder(vec_child)),
|
|
||||||
ChildSpec::SingleChild(single_child) => match single_child.build() {
|
ChildSpec::SingleChild(single_child) => match single_child.build() {
|
||||||
SingleChildToBuild::Type(single_type_child) => {
|
SingleChildToBuild::Type(single_type_child) => {
|
||||||
Some(make_single_type_child_holder(single_type_child))
|
let child_ident = format_ident!("{}", single_type_child.var_name());
|
||||||
|
let child_type_ident = format_ident!("{}", single_type_child.build());
|
||||||
|
Some(quote! {
|
||||||
|
let mut #child_ident: Option<#child_type_ident> = None;
|
||||||
|
})
|
||||||
}
|
}
|
||||||
SingleChildToBuild::Boolean(boolean_child) => {
|
SingleChildToBuild::Boolean(boolean_child) => {
|
||||||
Some(make_single_boolean_child_holder(boolean_child))
|
let child_ident = format_ident!("{}", boolean_child.var_name());
|
||||||
|
Some(quote! {
|
||||||
|
let #child_ident: bool = false
|
||||||
|
})
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
@ -65,7 +52,7 @@ fn make_match_action(child_spec: &ChildSpec) -> TokenStream {
|
|||||||
),
|
),
|
||||||
};
|
};
|
||||||
quote! {
|
quote! {
|
||||||
#child_name_ident.push(Box::new(#build_fn_ident(inner_pair)))
|
#child_name_ident.push(#build_fn_ident(inner_pair))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ChildSpec::SingleChild(single_child) => match single_child.build() {
|
ChildSpec::SingleChild(single_child) => match single_child.build() {
|
||||||
@ -73,7 +60,7 @@ fn make_match_action(child_spec: &ChildSpec) -> TokenStream {
|
|||||||
let child_name_ident = format_ident!("{}", single_type_child.var_name());
|
let child_name_ident = format_ident!("{}", single_type_child.var_name());
|
||||||
let build_fn_ident = format_ident!("{}", single_type_child.with());
|
let build_fn_ident = format_ident!("{}", single_type_child.with());
|
||||||
quote! {
|
quote! {
|
||||||
#child_name_ident = Some(Box::new(#build_fn_ident(inner_pair)))
|
#child_name_ident = Some(#build_fn_ident(inner_pair))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
SingleChildToBuild::Boolean(single_boolean_child) => {
|
SingleChildToBuild::Boolean(single_boolean_child) => {
|
||||||
@ -103,57 +90,6 @@ fn make_rule_matcher(child_spec: &ChildSpec) -> TokenStream {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn make_child_arg(child_spec: &ChildSpec) -> Option<TokenStream> {
|
|
||||||
match child_spec {
|
|
||||||
ChildSpec::SkipChild(_) => None,
|
|
||||||
ChildSpec::VecChild(vec_child) => {
|
|
||||||
let child_ident = match vec_child.build() {
|
|
||||||
VecChildToBuild::Type(vec_type_child) => {
|
|
||||||
format_ident!("{}", vec_type_child.var_name())
|
|
||||||
}
|
|
||||||
};
|
|
||||||
Some(quote! { #child_ident })
|
|
||||||
}
|
|
||||||
ChildSpec::SingleChild(single_child) => match single_child.build() {
|
|
||||||
SingleChildToBuild::Type(single_type_child) => {
|
|
||||||
let child_ident = format_ident!("{}", single_type_child.var_name());
|
|
||||||
if single_type_child.optional() {
|
|
||||||
Some(quote! { #child_ident })
|
|
||||||
} else if let Some(or_else) = single_type_child.or_else() {
|
|
||||||
let child_type_ident = format_ident!("{}", single_type_child.build());
|
|
||||||
let or_else_ident = format_ident!("{}", or_else);
|
|
||||||
Some(quote! {
|
|
||||||
#child_ident.unwrap_or_else(|| Box::new(#child_type_ident::#or_else_ident()))
|
|
||||||
})
|
|
||||||
} else {
|
|
||||||
Some(quote! { #child_ident.unwrap() })
|
|
||||||
}
|
|
||||||
}
|
|
||||||
SingleChildToBuild::Boolean(single_boolean_child) => {
|
|
||||||
let child_ident = format_ident!("{}", single_boolean_child.var_name());
|
|
||||||
Some(quote! { #child_ident })
|
|
||||||
}
|
|
||||||
},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn make_return_value_stream(build_spec: &StructBuildSpec) -> TokenStream {
|
|
||||||
let type_ident = format_ident!("{}", build_spec.build());
|
|
||||||
let child_args = build_spec
|
|
||||||
.children()
|
|
||||||
.iter()
|
|
||||||
.map(|child| make_child_arg(child))
|
|
||||||
.filter(|child_arg| child_arg.is_some())
|
|
||||||
.map(|child_arg| child_arg.unwrap())
|
|
||||||
.collect::<Vec<_>>();
|
|
||||||
|
|
||||||
quote! {
|
|
||||||
#type_ident::new(
|
|
||||||
#(#child_args,)*
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn make_struct_build_fn(build_spec: &StructBuildSpec) -> TokenStream {
|
pub fn make_struct_build_fn(build_spec: &StructBuildSpec) -> TokenStream {
|
||||||
let build_fn_ident = format_ident!("{}", build_spec.with());
|
let build_fn_ident = format_ident!("{}", build_spec.with());
|
||||||
let pair_ident = format_ident!("{}_pair", build_spec.build().to_case(Case::Snake));
|
let pair_ident = format_ident!("{}_pair", build_spec.build().to_case(Case::Snake));
|
||||||
@ -181,66 +117,11 @@ pub fn make_struct_build_fn(build_spec: &StructBuildSpec) -> TokenStream {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
let new_stream = make_return_value_stream(build_spec);
|
|
||||||
|
|
||||||
quote! {
|
quote! {
|
||||||
fn #build_fn_ident(#pair_ident: Pair<Rule>) -> #return_type_ident {
|
fn #build_fn_ident(#pair_ident: Pair<Rule>) -> #return_type_ident {
|
||||||
#(#child_holders;)*
|
#(#child_holders;)*
|
||||||
|
|
||||||
#iter_stream
|
#iter_stream
|
||||||
|
|
||||||
#new_stream
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
|
||||||
mod tests {
|
|
||||||
use super::*;
|
|
||||||
use crate::spec::VecTypeChildToBuild;
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn vec_child_holder() {
|
|
||||||
let vec_child = VecChild::new(
|
|
||||||
"test_child",
|
|
||||||
"Test",
|
|
||||||
VecChildToBuild::Type(VecTypeChildToBuild::new(
|
|
||||||
"TestType",
|
|
||||||
"test_child",
|
|
||||||
"build_test_child",
|
|
||||||
)),
|
|
||||||
);
|
|
||||||
assert_eq!(
|
|
||||||
make_vec_child_holder(&vec_child).to_string(),
|
|
||||||
quote! {
|
|
||||||
let mut test_child: Vec<Box<TestType>> = vec![]
|
|
||||||
}
|
|
||||||
.to_string()
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn single_type_child_holder() {
|
|
||||||
let single_type_child = SingleTypeChildToBuild::from_build_or_rule("TestType", None, false);
|
|
||||||
assert_eq!(
|
|
||||||
make_single_type_child_holder(&single_type_child).to_string(),
|
|
||||||
quote! {
|
|
||||||
let mut test_type: Option<Box<TestType>> = None
|
|
||||||
}
|
|
||||||
.to_string()
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn single_boolean_child_holder() {
|
|
||||||
let single_boolean_child =
|
|
||||||
SingleBooleanChildToBuild::new("test_child", BuildBooleanOn::RulePresent);
|
|
||||||
assert_eq!(
|
|
||||||
make_single_boolean_child_holder(&single_boolean_child).to_string(),
|
|
||||||
quote! {
|
|
||||||
let mut test_child: bool = false
|
|
||||||
}
|
|
||||||
.to_string()
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
@ -46,10 +46,9 @@ fn get_vec_child(name: &str, rule: &str, build: &Yaml) -> ChildSpec {
|
|||||||
))
|
))
|
||||||
}
|
}
|
||||||
|
|
||||||
fn get_single_child_to_build(name: &str, rule: &str, optional: bool, build: &Yaml) -> SingleChildToBuild {
|
fn get_single_child_to_build(name: &str, rule: &str, build: &Yaml) -> SingleChildToBuild {
|
||||||
if build.is_hash() {
|
if build.is_hash() {
|
||||||
match build["type"].as_str() {
|
let r#type = build["type"].as_str().unwrap();
|
||||||
Some(r#type) => {
|
|
||||||
let var_name = build["var"]
|
let var_name = build["var"]
|
||||||
.as_str()
|
.as_str()
|
||||||
.map(|s| s.to_string())
|
.map(|s| s.to_string())
|
||||||
@ -63,41 +62,19 @@ fn get_single_child_to_build(name: &str, rule: &str, optional: bool, build: &Yam
|
|||||||
} else {
|
} else {
|
||||||
todo!("currently on boolean types with on: rule_present are supported")
|
todo!("currently on boolean types with on: rule_present are supported")
|
||||||
}
|
}
|
||||||
},
|
|
||||||
None => {
|
|
||||||
let or_else = build["or_else"]
|
|
||||||
.as_str()
|
|
||||||
.map(|s| s.to_string())
|
|
||||||
.or_else(|| {
|
|
||||||
let or_else_default = build["or_else_default"]
|
|
||||||
.as_bool()
|
|
||||||
.unwrap_or_else(|| false);
|
|
||||||
if or_else_default {
|
|
||||||
Some(String::from("default"))
|
|
||||||
} else {
|
|
||||||
None
|
|
||||||
}
|
|
||||||
});
|
|
||||||
SingleChildToBuild::Type(SingleTypeChildToBuild::from_build_or_rule(
|
|
||||||
rule,
|
|
||||||
or_else,
|
|
||||||
optional,
|
|
||||||
))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
match build.as_str() {
|
match build.as_str() {
|
||||||
Some(s) => SingleChildToBuild::Type(SingleTypeChildToBuild::from_build_or_rule(s, None, optional)),
|
Some(s) => SingleChildToBuild::Type(SingleTypeChildToBuild::from_build_or_rule(s)),
|
||||||
None => SingleChildToBuild::Type(SingleTypeChildToBuild::from_build_or_rule(rule, None, optional)),
|
None => SingleChildToBuild::Type(SingleTypeChildToBuild::from_build_or_rule(rule)),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn get_single_child(name: &str, rule: &str, optional: bool, build: &Yaml) -> ChildSpec {
|
fn get_single_child(name: &str, rule: &str, build: &Yaml) -> ChildSpec {
|
||||||
ChildSpec::SingleChild(SingleChild::new(
|
ChildSpec::SingleChild(SingleChild::new(
|
||||||
name,
|
name,
|
||||||
rule,
|
rule,
|
||||||
get_single_child_to_build(name, rule, optional, build),
|
get_single_child_to_build(name, rule, build),
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -115,25 +92,18 @@ fn get_child_specs(children: &Yaml) -> Vec<ChildSpec> {
|
|||||||
.map(|(name, props)| (name.as_str().unwrap(), props))
|
.map(|(name, props)| (name.as_str().unwrap(), props))
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
|
||||||
let rule = props["rule"]
|
let rule = props["rule"].as_str().unwrap();
|
||||||
.as_str()
|
|
||||||
.map(|s| s.to_string())
|
|
||||||
.unwrap_or(name.to_case(Case::Pascal));
|
|
||||||
|
|
||||||
if get_skip(&props["skip"]) {
|
if get_skip(&props["skip"]) {
|
||||||
return ChildSpec::SkipChild(SkipChild::new(name, &rule));
|
return ChildSpec::SkipChild(SkipChild::new(name, rule));
|
||||||
}
|
}
|
||||||
|
|
||||||
let build = &props["build"];
|
let build = &props["build"];
|
||||||
|
|
||||||
if get_vec(&props["vec"]) {
|
if get_vec(&props["vec"]) {
|
||||||
get_vec_child(name, &rule, build)
|
get_vec_child(name, rule, build)
|
||||||
} else {
|
} else {
|
||||||
let optional = props["optional"]
|
get_single_child(name, rule, build)
|
||||||
.as_bool()
|
|
||||||
.unwrap_or_else(|| false);
|
|
||||||
|
|
||||||
get_single_child(name, &rule, optional, build)
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
ChildSpec::SingleChild(SingleChild::from_name_snake(child_spec.as_str().unwrap()))
|
ChildSpec::SingleChild(SingleChild::from_name_snake(child_spec.as_str().unwrap()))
|
||||||
|
@ -9,7 +9,6 @@ use proc_macro2::TokenStream;
|
|||||||
use quote::quote;
|
use quote::quote;
|
||||||
use spec::BuildSpec;
|
use spec::BuildSpec;
|
||||||
use syn::File;
|
use syn::File;
|
||||||
use syn::spanned::Spanned;
|
|
||||||
|
|
||||||
fn debug_built_spec(build_spec: &BuildSpec, token_stream: &TokenStream) {
|
fn debug_built_spec(build_spec: &BuildSpec, token_stream: &TokenStream) {
|
||||||
println!("*** BuildSpec ***");
|
println!("*** BuildSpec ***");
|
||||||
|
@ -233,8 +233,6 @@ impl SingleChild {
|
|||||||
rule: name.to_case(Case::Pascal),
|
rule: name.to_case(Case::Pascal),
|
||||||
build: SingleChildToBuild::Type(SingleTypeChildToBuild::from_build_or_rule(
|
build: SingleChildToBuild::Type(SingleTypeChildToBuild::from_build_or_rule(
|
||||||
&name.to_case(Case::Pascal),
|
&name.to_case(Case::Pascal),
|
||||||
None,
|
|
||||||
false,
|
|
||||||
)),
|
)),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -274,22 +272,14 @@ pub struct SingleTypeChildToBuild {
|
|||||||
build: String,
|
build: String,
|
||||||
var_name: String,
|
var_name: String,
|
||||||
with: String,
|
with: String,
|
||||||
or_else: Option<String>,
|
|
||||||
optional: bool,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl SingleTypeChildToBuild {
|
impl SingleTypeChildToBuild {
|
||||||
pub fn from_build_or_rule(
|
pub fn from_build_or_rule(build_or_rule: &str) -> Self {
|
||||||
build_or_rule: &str,
|
|
||||||
or_else: Option<String>,
|
|
||||||
optional: bool,
|
|
||||||
) -> Self {
|
|
||||||
Self {
|
Self {
|
||||||
build: build_or_rule.to_string(),
|
build: build_or_rule.to_string(),
|
||||||
var_name: build_or_rule.to_case(Case::Snake),
|
var_name: build_or_rule.to_case(Case::Snake),
|
||||||
with: make_build_fn_name(build_or_rule),
|
with: make_build_fn_name(build_or_rule),
|
||||||
or_else,
|
|
||||||
optional,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -307,16 +297,6 @@ impl SingleTypeChildToBuild {
|
|||||||
pub fn with(&self) -> &str {
|
pub fn with(&self) -> &str {
|
||||||
&self.with
|
&self.with
|
||||||
}
|
}
|
||||||
|
|
||||||
/// The default fn to call when unwrapping the child (before passing as arg to new).
|
|
||||||
pub fn or_else(&self) -> Option<&str> {
|
|
||||||
self.or_else.as_deref()
|
|
||||||
}
|
|
||||||
|
|
||||||
/// If the type should be wrapped in an Option.
|
|
||||||
pub fn optional(&self) -> bool {
|
|
||||||
self.optional
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
|
@ -64,15 +64,9 @@ fn handle_single_type_child(
|
|||||||
let child_ident_mut = format_ident!("{}_mut", single_type_child.var_name());
|
let child_ident_mut = format_ident!("{}_mut", single_type_child.var_name());
|
||||||
let child_type_ident = format_ident!("{}", single_type_child.build());
|
let child_type_ident = format_ident!("{}", single_type_child.build());
|
||||||
member_names.push(child_ident.clone());
|
member_names.push(child_ident.clone());
|
||||||
if single_type_child.optional() {
|
|
||||||
annotated_members.push(quote! {
|
|
||||||
#child_ident: Option<Box<#child_type_ident>>
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
annotated_members.push(quote! {
|
annotated_members.push(quote! {
|
||||||
#child_ident: Box<#child_type_ident>
|
#child_ident: Box<#child_type_ident>
|
||||||
})
|
});
|
||||||
}
|
|
||||||
accessors.push(quote! {
|
accessors.push(quote! {
|
||||||
pub fn #child_ident(&self) -> &#child_type_ident {
|
pub fn #child_ident(&self) -> &#child_type_ident {
|
||||||
self.#child_ident.as_ref()
|
self.#child_ident.as_ref()
|
||||||
|
@ -1,5 +0,0 @@
|
|||||||
use math::add
|
|
||||||
|
|
||||||
fn main()
|
|
||||||
println add(1, 2) // 3
|
|
||||||
end
|
|
@ -1,3 +0,0 @@
|
|||||||
mod math
|
|
||||||
|
|
||||||
pub fn add(a: Int, b: Int) = a + b
|
|
@ -78,32 +78,18 @@ $defs:
|
|||||||
properties:
|
properties:
|
||||||
rule:
|
rule:
|
||||||
type: string
|
type: string
|
||||||
description: The type to build, in Pascal case.
|
|
||||||
optional:
|
|
||||||
type: boolean
|
|
||||||
description: If true, this child will be stored as an Option.
|
|
||||||
build:
|
build:
|
||||||
oneOf:
|
oneOf:
|
||||||
- type: string
|
- type: string
|
||||||
- $ref: "#/$defs/SingleChildBuildDefinition"
|
- $ref: "#/$defs/SingleChildBuildDefinition"
|
||||||
|
required:
|
||||||
|
- rule
|
||||||
SingleChildBuildDefinition:
|
SingleChildBuildDefinition:
|
||||||
type: object
|
type: object
|
||||||
additionalProperties: false
|
additionalProperties: false
|
||||||
description: A definition of what exactly to build for a given child rule.
|
description: A definition of what exactly to build for a given child rule.
|
||||||
oneOf:
|
oneOf:
|
||||||
- $ref: "#/$defs/BuildSingleTypeChild"
|
|
||||||
- $ref: "#/$defs/BuildBooleanChild"
|
- $ref: "#/$defs/BuildBooleanChild"
|
||||||
BuildSingleTypeChild:
|
|
||||||
type: object
|
|
||||||
additionalProperties: false
|
|
||||||
description: A definition of a single-type child to build.
|
|
||||||
properties:
|
|
||||||
or_else:
|
|
||||||
type: string
|
|
||||||
description: The method name to call upon the built-type if the rule is not found. Takes precedence over "or_else_default".
|
|
||||||
or_else_default:
|
|
||||||
type: boolean
|
|
||||||
description: Whether to call the default method on the built-type if the rule is not found.
|
|
||||||
BuildBooleanChild:
|
BuildBooleanChild:
|
||||||
type: object
|
type: object
|
||||||
additionalProperties: false
|
additionalProperties: false
|
||||||
|
@ -1,21 +1,19 @@
|
|||||||
# $schema: ./ast.schema.yaml
|
# $schema: ./ast.schema.yaml
|
||||||
# Top-level constructs
|
|
||||||
CompilationUnit:
|
CompilationUnit:
|
||||||
children:
|
children:
|
||||||
- parent_mod
|
- namespace
|
||||||
- use_statements:
|
- use_statements:
|
||||||
rule: UseStatement
|
rule: UseStatement
|
||||||
vec: true
|
vec: true
|
||||||
- module_level_declarations:
|
- module_level_declarations:
|
||||||
rule: ModuleLevelDeclaration
|
rule: ModuleLevelDeclaration
|
||||||
vec: true
|
Namespace:
|
||||||
ParentMod:
|
|
||||||
children:
|
children:
|
||||||
- mod_kw:
|
- ns_kw:
|
||||||
rule: Mod
|
rule: Ns
|
||||||
skip: true
|
skip: true
|
||||||
- fqn:
|
- fqn:
|
||||||
rule: FullyQualifiedName
|
rule: Fqn
|
||||||
UseStatement:
|
UseStatement:
|
||||||
children:
|
children:
|
||||||
- use_kw:
|
- use_kw:
|
||||||
@ -26,49 +24,17 @@ UseStatement:
|
|||||||
vec: true
|
vec: true
|
||||||
- suffix:
|
- suffix:
|
||||||
rule: UseStatementSuffix
|
rule: UseStatementSuffix
|
||||||
UseStatementPrefix:
|
|
||||||
children:
|
|
||||||
- identifier
|
|
||||||
UseStatementSuffix:
|
|
||||||
rules:
|
|
||||||
- Identifier
|
|
||||||
- rule: Star
|
|
||||||
build: UseStatementStarSuffix
|
|
||||||
- UseList
|
|
||||||
UseList:
|
|
||||||
children:
|
|
||||||
- identifiers:
|
|
||||||
rule: Identifier
|
|
||||||
vec: true
|
|
||||||
|
|
||||||
# Level declarations
|
|
||||||
ModuleLevelDeclaration:
|
ModuleLevelDeclaration:
|
||||||
rules:
|
rules:
|
||||||
- Module
|
- rule: Module
|
||||||
- Interface
|
build: ModuleDeclaration
|
||||||
- Class
|
- rule: Interface
|
||||||
- Function
|
build: InterfaceDeclaration
|
||||||
|
- rule: Class
|
||||||
|
build: ClassDeclaration
|
||||||
|
- FunctionDefinition
|
||||||
- PlatformFunction
|
- PlatformFunction
|
||||||
InterfaceLevelDeclaration:
|
ModuleDeclaration:
|
||||||
rules:
|
|
||||||
- CompanionModule
|
|
||||||
- Interface
|
|
||||||
- Class
|
|
||||||
- InterfaceFunction
|
|
||||||
- InterfaceDefaultFunction
|
|
||||||
- InterfaceOperatorFunction
|
|
||||||
- InterfaceDefaultOperatorFunction
|
|
||||||
ClassLevelDeclaration:
|
|
||||||
children:
|
|
||||||
- CompanionModule
|
|
||||||
- Interface
|
|
||||||
- Class
|
|
||||||
- Function
|
|
||||||
- OperatorFunction
|
|
||||||
- PlatformFunction
|
|
||||||
|
|
||||||
# Main organizational constructs
|
|
||||||
Module:
|
|
||||||
children:
|
children:
|
||||||
- is_public:
|
- is_public:
|
||||||
rule: Pub
|
rule: Pub
|
||||||
@ -83,47 +49,7 @@ Module:
|
|||||||
- declarations:
|
- declarations:
|
||||||
rule: ModuleLevelDeclaration
|
rule: ModuleLevelDeclaration
|
||||||
vec: true
|
vec: true
|
||||||
- end_kw:
|
ClassDeclaration:
|
||||||
rule: End
|
|
||||||
skip: true
|
|
||||||
CompanionModule:
|
|
||||||
children:
|
|
||||||
- companion_kw:
|
|
||||||
rule: Companion
|
|
||||||
skip: true
|
|
||||||
- mod_kw:
|
|
||||||
rule: Mod
|
|
||||||
skip: true
|
|
||||||
- declarations:
|
|
||||||
rule: ModuleLevelDeclaration
|
|
||||||
vec: true
|
|
||||||
- end_kw:
|
|
||||||
rule: End
|
|
||||||
skip: true
|
|
||||||
Interface:
|
|
||||||
children:
|
|
||||||
- is_public:
|
|
||||||
rule: Pub
|
|
||||||
build:
|
|
||||||
type: boolean
|
|
||||||
on: rule_present
|
|
||||||
- int_kw:
|
|
||||||
rule: IntKw
|
|
||||||
skip: true
|
|
||||||
- identifier
|
|
||||||
- generic_parameters:
|
|
||||||
build:
|
|
||||||
or_else_default: true
|
|
||||||
- implements_list:
|
|
||||||
build:
|
|
||||||
or_else_default: true
|
|
||||||
- declarations:
|
|
||||||
rule: InterfaceLevelDeclaration
|
|
||||||
vec: true
|
|
||||||
- end_kw:
|
|
||||||
rule: End
|
|
||||||
skip: true
|
|
||||||
Class:
|
|
||||||
children:
|
children:
|
||||||
- is_public:
|
- is_public:
|
||||||
rule: Pub
|
rule: Pub
|
||||||
@ -134,27 +60,22 @@ Class:
|
|||||||
rule: ClassKw
|
rule: ClassKw
|
||||||
skip: true
|
skip: true
|
||||||
- identifier
|
- identifier
|
||||||
- generic_parameters:
|
- generic_parameters
|
||||||
build:
|
- class_constructor
|
||||||
or_else_default: true
|
- implements_list
|
||||||
- class_constructor:
|
|
||||||
build:
|
|
||||||
or_else_default: true
|
|
||||||
- implements_list:
|
|
||||||
build:
|
|
||||||
or_else_default: true
|
|
||||||
- class_level_declarations:
|
- class_level_declarations:
|
||||||
rule: ClassLevelDeclaration
|
rule: ClassLevelDeclaration
|
||||||
vec: true
|
vec: true
|
||||||
|
FunctionDeclaration:
|
||||||
# Function constructs
|
|
||||||
Function:
|
|
||||||
children:
|
children:
|
||||||
- is_public:
|
- is_public:
|
||||||
rule: Pub
|
rule: Pub
|
||||||
build:
|
build:
|
||||||
type: boolean
|
type: boolean
|
||||||
on: rule_present
|
on: rule_present
|
||||||
|
- modifier:
|
||||||
|
rule: Modifier
|
||||||
|
build: FunctionModifier
|
||||||
- fn_kw:
|
- fn_kw:
|
||||||
rule: Fn
|
rule: Fn
|
||||||
skip: true
|
skip: true
|
||||||
@ -162,47 +83,5 @@ Function:
|
|||||||
rule: GenericParameters
|
rule: GenericParameters
|
||||||
- identifier
|
- identifier
|
||||||
- parameters
|
- parameters
|
||||||
- return_type:
|
|
||||||
build:
|
|
||||||
or_else: void
|
|
||||||
- function_body
|
|
||||||
OperatorFunction:
|
|
||||||
children:
|
|
||||||
- is_public:
|
|
||||||
rule: Pub
|
|
||||||
build:
|
|
||||||
type: boolean
|
|
||||||
on: rule_present
|
|
||||||
- op_kw:
|
|
||||||
rule: Op
|
|
||||||
skip: true
|
|
||||||
- generics:
|
|
||||||
rule: GenericParameters
|
|
||||||
build:
|
|
||||||
or_else_default: true
|
|
||||||
- operator
|
|
||||||
- parameters
|
|
||||||
- return_type:
|
|
||||||
build:
|
|
||||||
or_else: void
|
|
||||||
- function_body
|
|
||||||
PlatformFunction:
|
|
||||||
children:
|
|
||||||
- is_public:
|
|
||||||
rule: Pub
|
|
||||||
build:
|
|
||||||
type: boolean
|
|
||||||
on: rule_present
|
|
||||||
- platform_kw:
|
|
||||||
rule: Platform
|
|
||||||
skip: true
|
|
||||||
- fn_kw:
|
|
||||||
rule: Fn
|
|
||||||
skip: true
|
|
||||||
- generics:
|
|
||||||
rule: GenericParameters
|
|
||||||
build:
|
|
||||||
or_else_default: true
|
|
||||||
- identifier
|
|
||||||
- parameters
|
|
||||||
- return_type
|
- return_type
|
||||||
|
- function_body
|
||||||
|
@ -30,8 +30,6 @@ Alias = { "alias" }
|
|||||||
True = { "true" }
|
True = { "true" }
|
||||||
False = { "false" }
|
False = { "false" }
|
||||||
Use = { "use" }
|
Use = { "use" }
|
||||||
End = { "end" }
|
|
||||||
Companion = { "comp" }
|
|
||||||
|
|
||||||
// Keywords: primitive types
|
// Keywords: primitive types
|
||||||
Byte = { "Byte" }
|
Byte = { "Byte" }
|
||||||
@ -324,31 +322,22 @@ RefList = {
|
|||||||
|
|
||||||
CompilationUnit = {
|
CompilationUnit = {
|
||||||
SOI
|
SOI
|
||||||
~ ParentMod?
|
~ ( Namespace ~ Semicolon )?
|
||||||
~ ( UseStatement | ModuleLevelDeclaration )*
|
~ ( UseStatement ~ Semicolon )*
|
||||||
|
~ ModuleLevelDeclaration*
|
||||||
~ EOI
|
~ EOI
|
||||||
}
|
}
|
||||||
|
|
||||||
ParentMod = {
|
Namespace = {
|
||||||
Mod
|
Ns
|
||||||
~ FullyQualifiedName
|
~ FullyQualifiedName
|
||||||
}
|
}
|
||||||
|
|
||||||
UseStatement = {
|
UseStatement = {
|
||||||
Use
|
Use
|
||||||
~ UseStatementPrefix*
|
~ Identifier
|
||||||
~ UseStatementSuffix
|
~ ( "::" ~ Identifier )*
|
||||||
}
|
~ ( "::" ~ ( Star | UseList ) )?
|
||||||
|
|
||||||
UseStatementPrefix = {
|
|
||||||
Identifier
|
|
||||||
~ "::"
|
|
||||||
}
|
|
||||||
|
|
||||||
UseStatementSuffix = {
|
|
||||||
Identifier
|
|
||||||
| Star
|
|
||||||
| UseList
|
|
||||||
}
|
}
|
||||||
|
|
||||||
UseList = {
|
UseList = {
|
||||||
@ -364,12 +353,12 @@ ModuleLevelDeclaration = {
|
|||||||
Module
|
Module
|
||||||
| Interface
|
| Interface
|
||||||
| Class
|
| Class
|
||||||
| Function
|
| FunctionDefinition
|
||||||
| PlatformFunction
|
| PlatformFunction
|
||||||
}
|
}
|
||||||
|
|
||||||
InterfaceLevelDeclaration = {
|
InterfaceLevelDeclaration = {
|
||||||
CompanionModule
|
Module
|
||||||
| Interface
|
| Interface
|
||||||
| Class
|
| Class
|
||||||
| InterfaceFunction
|
| InterfaceFunction
|
||||||
@ -379,12 +368,14 @@ InterfaceLevelDeclaration = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
ClassLevelDeclaration = {
|
ClassLevelDeclaration = {
|
||||||
CompanionModule
|
Module
|
||||||
| Interface
|
| Interface
|
||||||
| Class
|
| Class
|
||||||
| Function
|
| FunctionDefinition
|
||||||
| OperatorFunction
|
| OperatorFunctionDefinition
|
||||||
| PlatformFunction
|
| PlatformFunction
|
||||||
|
| Property
|
||||||
|
| Field
|
||||||
}
|
}
|
||||||
|
|
||||||
// Main organizational constructs
|
// Main organizational constructs
|
||||||
@ -393,15 +384,7 @@ Module = {
|
|||||||
Pub?
|
Pub?
|
||||||
~ Mod
|
~ Mod
|
||||||
~ Identifier
|
~ Identifier
|
||||||
~ ModuleLevelDeclaration*
|
~ "{" ~ ModuleLevelDeclaration* ~ "}"
|
||||||
~ End
|
|
||||||
}
|
|
||||||
|
|
||||||
CompanionModule = {
|
|
||||||
Companion
|
|
||||||
~ Mod
|
|
||||||
~ ModuleLevelDeclaration*
|
|
||||||
~ End
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Interface = {
|
Interface = {
|
||||||
@ -410,8 +393,7 @@ Interface = {
|
|||||||
~ Identifier
|
~ Identifier
|
||||||
~ GenericParameters?
|
~ GenericParameters?
|
||||||
~ ImplementsList?
|
~ ImplementsList?
|
||||||
~ InterfaceLevelDeclaration*
|
~ ( "{" ~ InterfaceLevelDeclaration* ~ "}" )?
|
||||||
~ End
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Class = {
|
Class = {
|
||||||
@ -421,14 +403,14 @@ Class = {
|
|||||||
~ GenericParameters?
|
~ GenericParameters?
|
||||||
~ ClassConstructor?
|
~ ClassConstructor?
|
||||||
~ ImplementsList?
|
~ ImplementsList?
|
||||||
~ ClassLevelDeclaration*
|
~ ( "{" ~ ClassLevelDeclaration* ~ "}" )?
|
||||||
~ End
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Function constructs
|
// Function constructs
|
||||||
|
|
||||||
Function = {
|
FunctionDefinition = {
|
||||||
Pub?
|
Pub?
|
||||||
|
~ FunctionModifier?
|
||||||
~ Fn
|
~ Fn
|
||||||
~ GenericParameters?
|
~ GenericParameters?
|
||||||
~ Identifier
|
~ Identifier
|
||||||
@ -437,8 +419,9 @@ Function = {
|
|||||||
~ FunctionBody
|
~ FunctionBody
|
||||||
}
|
}
|
||||||
|
|
||||||
OperatorFunction = {
|
OperatorFunctionDefinition = {
|
||||||
Pub?
|
Pub?
|
||||||
|
~ FunctionModifier?
|
||||||
~ Op
|
~ Op
|
||||||
~ GenericParameters?
|
~ GenericParameters?
|
||||||
~ Operator
|
~ Operator
|
||||||
@ -449,12 +432,14 @@ OperatorFunction = {
|
|||||||
|
|
||||||
PlatformFunction = {
|
PlatformFunction = {
|
||||||
Pub?
|
Pub?
|
||||||
|
~ FunctionModifier?
|
||||||
~ Platform
|
~ Platform
|
||||||
~ Fn
|
~ Fn
|
||||||
~ GenericParameters?
|
~ GenericParameters?
|
||||||
~ Identifier
|
~ Identifier
|
||||||
~ Parameters
|
~ Parameters
|
||||||
~ ReturnType
|
~ ReturnType
|
||||||
|
~ ";"
|
||||||
}
|
}
|
||||||
|
|
||||||
InterfaceFunction = {
|
InterfaceFunction = {
|
||||||
@ -497,7 +482,13 @@ InterfaceDefaultOperatorFunction = {
|
|||||||
~ FunctionBody
|
~ FunctionBody
|
||||||
}
|
}
|
||||||
|
|
||||||
// Function Components
|
FunctionModifier = {
|
||||||
|
Static
|
||||||
|
| Cons
|
||||||
|
| Mut ~ Ref
|
||||||
|
| Mut
|
||||||
|
| Ref
|
||||||
|
}
|
||||||
|
|
||||||
FunctionBody = {
|
FunctionBody = {
|
||||||
FunctionAliasBody
|
FunctionAliasBody
|
||||||
|
Loading…
Reference in New Issue
Block a user