Update to Pest grammar for hello world.
This commit is contained in:
parent
db83cb7403
commit
d4fb4680a5
8
src/compiler/mod.rs
Normal file
8
src/compiler/mod.rs
Normal file
@ -0,0 +1,8 @@
|
||||
use crate::parser::{DeimosParser, Rule};
|
||||
use crate::vm::lib::DmLib;
|
||||
use pest::Parser;
|
||||
|
||||
pub fn compile(src_unit: &str) -> DmLib {
|
||||
let p = DeimosParser::parse(Rule::compilation_unit, src_unit).unwrap();
|
||||
todo!()
|
||||
}
|
@ -1,3 +1,4 @@
|
||||
mod compiler;
|
||||
pub mod parser;
|
||||
mod util;
|
||||
pub mod vm;
|
||||
|
@ -1,24 +1,31 @@
|
||||
compilation_unit = { SOI ~ namespace? ~ declaration* ~ EOI }
|
||||
namespace = { "ns" ~ fqn }
|
||||
|
||||
fqn = { identifier ~ ( "::" ~ fqn )* }
|
||||
fqn = { identifier ~ ( "::" ~ identifier )* }
|
||||
identifier = @{ identifier_start_char ~ identifier_char* }
|
||||
identifier_start_char = { 'a'..'z' | 'A'..'Z' | "_" }
|
||||
identifier_char = { 'a'..'z' | 'A'..'Z' | '0'..'9' | "_" }
|
||||
|
||||
declaration = { "decl"? ~ "pub"? ~ ( interface | module | property | function ) }
|
||||
declaration = { decl? ~ pub? ~ ( interface | implementation | module | function ) }
|
||||
decl = { "decl" }
|
||||
pub = { "pub" }
|
||||
|
||||
interface = { "int" ~ identifier ~ generics_declaration? ~ interface_extends_list? ~ "{" ~ declaration* ~ "}"}
|
||||
interface_extends_list = { ":" ~ type ~ ( "+" ~ type )* }
|
||||
interface = { "int" ~ identifier ~ generics_declaration? ~ extends_list? ~ ( "{" ~ declaration* ~ "}" )? }
|
||||
extends_list = { ":" ~ type ~ ( "+" ~ type )* }
|
||||
|
||||
implementation = { "impl" ~ identifier ~ generics_declaration? ~ impl_ctor? ~ extends_list? }
|
||||
impl_ctor = { "(" ~ impl_ctor_args? ~ ")" }
|
||||
impl_ctor_args = { impl_ctor_arg ~ ( "," ~ impl_ctor_arg )* }
|
||||
impl_ctor_arg = { fld? ~ identifier ~ ":" ~ type }
|
||||
fld = { "fld" }
|
||||
|
||||
module = { "mod" ~ identifier ~ "{" ~ declaration* ~ "}" }
|
||||
|
||||
property = { identifier ~ ":" ~ type }
|
||||
|
||||
function = { "fn" ~ generics_declaration? ~ identifier ~ "(" ~ args_list? ~ ")" ~ ( ":" ~ type )? ~ ( "{" ~ "}" )? }
|
||||
|
||||
function = { "fn" ~ generics_declaration? ~ identifier ~ "(" ~ args_list? ~ ")" ~ ( ":" ~ type )? ~ ( function_body | function_equals_body ) }
|
||||
function_equals_body = { "=" ~ expression }
|
||||
function_body = { "{" ~ "}" }
|
||||
function_body = { "{" ~ statement* ~ "}" }
|
||||
|
||||
type = { identifier ~ generics_declaration? }
|
||||
generics_declaration = { "<" ~ identifier ~ ( "," ~ identifier )* ~ ">"}
|
||||
@ -26,12 +33,29 @@ generics_declaration = { "<" ~ identifier ~ ( "," ~ identifier )* ~ ">"}
|
||||
args_list = { arg ~ ( "," ~ arg )* }
|
||||
arg = { identifier ~ ( ":" ~ "..."? ~ type )? }
|
||||
|
||||
expression = { literal }
|
||||
statement = { call_stmt }
|
||||
|
||||
literal = { number_literal }
|
||||
call_stmt = { call_expr }
|
||||
|
||||
call_expr = { call_expr_with_parens | call_expr_no_parens }
|
||||
call_expr_with_parens = { fqn ~ "(" ~ call_args? ~ ")" }
|
||||
call_expr_no_parens = { fqn ~ call_args }
|
||||
call_args = { call_arg ~ ( "," ~ call_arg )* }
|
||||
call_arg = { expression }
|
||||
|
||||
expression = { literal | identifier }
|
||||
|
||||
literal = { number_literal | string_literal }
|
||||
|
||||
number_literal = { int_literal }
|
||||
|
||||
int_literal = { '0'..'9'+ }
|
||||
|
||||
WHITESPACE = { " " | "\t" | "\n" | "\r" }
|
||||
string_literal = ${ "\"" ~ string_inner ~ "\"" }
|
||||
string_inner = @{ string_char* }
|
||||
string_char = {
|
||||
!( "\"" | "\\" ) ~ ANY
|
||||
| "\\" ~ ( "\"" | "\\" | "/" | "b" | "f" | "n" | "r" | "t" )
|
||||
| "\\" ~ ( "u" ~ ASCII_HEX_DIGIT{4} )
|
||||
}
|
||||
|
||||
WHITESPACE = _{ " " | "\t" | "\n" | "\r" }
|
Loading…
Reference in New Issue
Block a user