v/vlib/v/ast/ast.v

164 lines
2.0 KiB
V
Raw Normal View History

2019-12-22 02:34:37 +01:00
// Copyright (c) 2019 Alexander Medvednikov. All rights reserved.
// Use of this source code is governed by an MIT license
// that can be found in the LICENSE file.
module ast
import (
v.token
2019-12-27 08:52:20 +01:00
v.types
2019-12-22 02:34:37 +01:00
)
struct Foo {}
2019-12-27 13:57:49 +01:00
pub type Expr = BinaryExpr | UnaryExpr | IfExpr |
StringLiteral | IntegerLiteral | FloatLiteral | VarDecl |
FnDecl | Return
pub type Stmt = Foo//VarDecl
2019-12-22 02:34:37 +01:00
2019-12-26 11:21:41 +01:00
pub struct IntegerLiteral {
pub:
val int
}
2019-12-24 18:54:43 +01:00
2019-12-27 10:03:29 +01:00
pub struct FloatLiteral {
pub:
//val f64
val string
}
2019-12-24 18:54:43 +01:00
pub struct StringLiteral {
pub:
val string
}
2019-12-22 02:34:37 +01:00
2019-12-27 13:57:49 +01:00
pub struct FnDecl {
pub:
name string
//stmts []Stmt
exprs []Expr
typ types.Type
}
pub struct Return {
pub:
expr Expr
}
2019-12-22 02:34:37 +01:00
/*
pub enum Expr {
Binary(BinaryExpr)
If(IfExpr)
Integer(IntegerExpr)
}
*/
2019-12-24 18:54:43 +01:00
/*
2019-12-22 02:34:37 +01:00
pub struct Stmt {
pos int
//end int
}
2019-12-24 18:54:43 +01:00
*/
pub struct VarDecl {
pub:
name string
expr Expr
2019-12-27 08:52:20 +01:00
typ types.Type
2019-12-24 18:54:43 +01:00
}
pub struct Program {
pub:
exprs []Expr
2019-12-27 09:35:30 +01:00
//stmts []Stmt
2019-12-24 18:54:43 +01:00
}
2019-12-22 02:34:37 +01:00
2019-12-22 02:34:37 +01:00
// A single identifier
struct Ident {
token token.Token
value string
}
pub struct BinaryExpr {
pub:
token token.Token
//op BinaryOp
op token.Token
left Expr
2019-12-27 08:52:20 +01:00
//left_type Type
2019-12-22 02:34:37 +01:00
right Expr
2019-12-27 08:52:20 +01:00
//right_type Type
2019-12-22 02:34:37 +01:00
}
pub struct UnaryExpr {
pub:
// token token.Token
//op BinaryOp
op token.Token
left Expr
}
2019-12-22 02:34:37 +01:00
struct IfExpr {
token token.Token
cond Expr
body []Stmt
else_ []Stmt
}
struct ReturnStmt {
token token.Token // or pos
results []Expr
}
// string representaiton of expr
pub fn (x Expr) str() string {
match x {
BinaryExpr {
return '(${it.left.str()} $it.op.str() ${it.right.str()})'
}
UnaryExpr {
return it.left.str() + it.op.str()
}
IntegerLiteral {
return it.val.str()
}
IntegerLiteral {
return '"$it.val"'
}
else { return '' }
}
2019-12-22 02:34:37 +01:00
}
/*
enum BinaryOp {
sum
difference
product
quotient
remainder
bitwise_and
bitwise_or
bitwise_xor
left_shift
right_shift
equality
inequality
less_than
less_than_or_equal
more_than
more_than_or_equal
in_check
//These are suffixed with `bool` to prevent conflict with the keyword `or`
and_bool
or_bool
}
*/