Minimal workflow for a Hello World
This commit is contained in:
parent
fe7cfe9d5f
commit
0d96efd4d8
13
CHANGELOG.md
13
CHANGELOG.md
@ -23,13 +23,20 @@
|
|||||||
- Include the original tokens in the AST
|
- Include the original tokens in the AST
|
||||||
|
|
||||||
|
|
||||||
|
## v0.0.15
|
||||||
|
|
||||||
|
- [ ] Replace all panics with actual errors
|
||||||
|
- [ ] Remove all old codegen
|
||||||
|
- [ ] Test codegen
|
||||||
|
- [ ] Begin work on the code formatter
|
||||||
|
|
||||||
|
|
||||||
## v0.0.14
|
## v0.0.14
|
||||||
|
|
||||||
- [x] Define a minimal PHP AST
|
- [x] Define a minimal PHP AST
|
||||||
- [x] Transform THP AST into PHP AST
|
- [x] Transform THP AST into PHP AST
|
||||||
- [ ] Implement minimal codegen for the PHP AST
|
- [x] Implement minimal codegen for the PHP AST
|
||||||
- [ ] Remove old codegen
|
- [x] Finish the workflow for a hello world
|
||||||
- [ ] Finish the workflow for a hello world
|
|
||||||
|
|
||||||
|
|
||||||
## v0.0.13
|
## v0.0.13
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "thp"
|
name = "thp"
|
||||||
version = "0.0.13"
|
version = "0.0.14"
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,4 +1,6 @@
|
|||||||
use crate::php_ast::{PhpAst, PhpStatement};
|
use std::os::linux::raw::stat;
|
||||||
|
|
||||||
|
use crate::php_ast::{PhpAst, PhpExpression, PhpStatement};
|
||||||
|
|
||||||
use super::Transpilable;
|
use super::Transpilable;
|
||||||
|
|
||||||
@ -18,10 +20,31 @@ impl Transpilable for PhpStatement<'_> {
|
|||||||
fn transpile(&self) -> String {
|
fn transpile(&self) -> String {
|
||||||
match self {
|
match self {
|
||||||
PhpStatement::PhpEchoStatement(expr_list) => {
|
PhpStatement::PhpEchoStatement(expr_list) => {
|
||||||
// TODO: Actually generate parameters from the expr_list
|
let expressions_vec = expr_list.expressions
|
||||||
"echo \"\";".into()
|
.iter()
|
||||||
|
.map(|e| e.transpile())
|
||||||
|
.collect::<Vec<_>>();
|
||||||
|
|
||||||
|
let expressions_str = if expressions_vec.is_empty() {
|
||||||
|
"\"\"".into()
|
||||||
|
} else {
|
||||||
|
expressions_vec.join(", ")
|
||||||
|
};
|
||||||
|
|
||||||
|
format!("echo {};", expressions_str)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl Transpilable for PhpExpression<'_> {
|
||||||
|
fn transpile(&self) -> String {
|
||||||
|
match self {
|
||||||
|
PhpExpression::String(value) => {
|
||||||
|
format!("{}", value)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
use super::super::PhpAst;
|
use super::super::PhpAst;
|
||||||
use crate::php_ast::{PhpExpressionList, PhpStatement};
|
use crate::php_ast::{PhpExpression, PhpExpressionList, PhpStatement};
|
||||||
use crate::syntax::ast::{Expression, ModuleAST, ModuleMembers};
|
use crate::syntax::ast::{Expression, ModuleAST, ModuleMembers};
|
||||||
|
|
||||||
use super::PHPTransformable;
|
use super::PHPTransformable;
|
||||||
@ -17,20 +17,31 @@ impl<'a> PHPTransformable<'a> for ModuleAST<'_> {
|
|||||||
php_statements.push(stmt.into_php_ast());
|
php_statements.push(stmt.into_php_ast());
|
||||||
}
|
}
|
||||||
ModuleMembers::Expr(expr) => {
|
ModuleMembers::Expr(expr) => {
|
||||||
// TODO: a print() function call is technically an
|
// TODO: This should be done by the Expression transformer
|
||||||
// expression in the AST, but PHP expects it to be an statement.
|
|
||||||
// transform beforehand?
|
|
||||||
|
|
||||||
match expr {
|
match expr {
|
||||||
Expression::FunctionCall(fc) => {
|
Expression::FunctionCall(fc) => {
|
||||||
let function_expr: &Expression = &*fc.function;
|
let function_expr: &Expression = &*fc.function;
|
||||||
match function_expr {
|
match function_expr {
|
||||||
Expression::Identifier(id) if *id == "print" => {
|
Expression::Identifier(id) if *id == "print" => {
|
||||||
// transform to print() expression
|
// transform to print() expression
|
||||||
// no parameters supported
|
// no parameters supported
|
||||||
php_statements.push(PhpStatement::PhpEchoStatement(PhpExpressionList {
|
|
||||||
expressions: vec![]
|
// transform parameters, expect them all to be strings
|
||||||
}));
|
|
||||||
|
let mut expressions = Vec::<PhpExpression>::new();
|
||||||
|
|
||||||
|
for e in fc.arguments.arguments.iter() {
|
||||||
|
match e {
|
||||||
|
Expression::String(v) => {
|
||||||
|
expressions.push(PhpExpression::String(v))
|
||||||
|
},
|
||||||
|
_ => panic!("Non string expressions not supported")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
php_statements.push(PhpStatement::PhpEchoStatement(PhpExpressionList {
|
||||||
|
expressions
|
||||||
|
}));
|
||||||
},
|
},
|
||||||
_ => todo!("Not implemented: AST transformation for function call that is not an identifier")
|
_ => todo!("Not implemented: AST transformation for function call that is not an identifier")
|
||||||
}
|
}
|
||||||
|
@ -62,6 +62,8 @@ pub struct Parameter<'a> {
|
|||||||
pub enum Expression<'a> {
|
pub enum Expression<'a> {
|
||||||
Int(&'a String),
|
Int(&'a String),
|
||||||
Float(&'a String),
|
Float(&'a String),
|
||||||
|
// TODO: Specify if this contains or not the original quotes ""
|
||||||
|
// TODO: After this fix where neccesary
|
||||||
String(&'a String),
|
String(&'a String),
|
||||||
Boolean(bool),
|
Boolean(bool),
|
||||||
Identifier(&'a String),
|
Identifier(&'a String),
|
||||||
|
Loading…
Reference in New Issue
Block a user