This repository has been archived on 2024-02-27. You can view files and clone it, but cannot push or open issues or pull requests.
arf/parser/tree.go

318 lines
5.6 KiB
Go
Raw Permalink Normal View History

package parser
2022-08-30 05:11:10 +00:00
import "git.tebibyte.media/arf/arf/file"
import "git.tebibyte.media/arf/arf/types"
2022-09-27 18:48:05 +00:00
import "git.tebibyte.media/arf/arf/lexer"
import "git.tebibyte.media/arf/arf/infoerr"
// SyntaxTree represents an abstract syntax tree. It covers an entire module. It
// can be expected to be syntactically correct, but it might not be semantically
// correct (because it has not been analyzed yet.)
type SyntaxTree struct {
2022-08-12 16:55:17 +00:00
license string
author string
requires map[string] string
sections map[string] Section
}
2022-09-04 18:02:48 +00:00
// Section can be any kind of section. You can find out what type of section it
// is with the Kind method.
type Section interface {
Location () (location file.Location)
Permission () (permission types.Permission)
Name () (name string)
NewError (message string, kind infoerr.ErrorKind) (err error)
ToString (indent int) (output string)
2022-09-04 18:02:48 +00:00
}
2022-09-05 02:27:06 +00:00
// Identifier represents a chain of names separated by a dot.
type Identifier struct {
locatable
trail []string
}
// TypeKind represents what kind of type a type is.
type TypeKind int
const (
2022-09-29 06:01:31 +00:00
// TypeKindNil means that the type is unspecified.
TypeKindNil TypeKind = iota
2022-09-12 19:27:29 +00:00
// TypeKindBasic means its a normal type and inherits from something.
// Basic types can define new members on their parent types.
2022-09-29 06:01:31 +00:00
TypeKindBasic
2022-09-12 19:27:29 +00:00
// TypeKindPointer means it's a pointer.
TypeKindPointer
2022-09-05 02:27:06 +00:00
// TypeKindVariableArray means it's an array of variable length.
TypeKindVariableArray
)
// Type represents a type specifier
type Type struct {
locatable
mutable bool
kind TypeKind
length uint64
// only applicable for basic.
name Identifier
// not applicable for basic.
points *Type
}
// Declaration represents a variable declaration.
type Declaration struct {
locatable
nameable
typeable
}
2022-09-27 18:17:03 +00:00
// List represents an array or object literal.
type List struct {
locatable
2022-09-27 22:03:27 +00:00
// TODO: have an array of unnamed arguments, and a map of named
// arguments
2022-09-27 18:17:03 +00:00
multiValuable
}
// ArgumentKind specifies the type of thing the value of an argument should be
// cast to.
type ArgumentKind int
const (
ArgumentKindNil ArgumentKind = iota
// [name argument]
// [name argument argument]
// etc...
ArgumentKindPhrase
2022-09-27 18:17:03 +00:00
// (argument argument argument)
ArgumentKindList
// {name}
// {name 23}
2022-10-11 15:23:50 +00:00
ArgumentKindDereference
// name.name
// name.name.name
// etc...
ArgumentKindIdentifier
// name:Type
// name:{Type}
// name:{Type ..}
// name:{Type 23}
// etc...
ArgumentKindDeclaration
// -1337
ArgumentKindInt
// 1337
ArgumentKindUInt
// 0.44
ArgumentKindFloat
2022-10-04 21:07:31 +00:00
// 'hello world'
ArgumentKindString
)
// Argument represents a value that can be placed anywhere a value goes. This
// allows things like phrases being arguments to other phrases.
type Argument struct {
locatable
kind ArgumentKind
value any
// TODO: if there is an argument expansion operator its existence should
// be stored here in a boolean.
}
// DataSection represents a global variable.
type DataSection struct {
locatable
nameable
typeable
permissionable
valuable
external bool
2022-08-18 20:56:42 +00:00
}
2022-09-28 15:07:39 +00:00
// TypeSectionMember represents a member variable of a type section.
type TypeSectionMember struct {
locatable
nameable
typeable
permissionable
valuable
bitWidth uint64
}
// TypeSection represents a type definition.
type TypeSection struct {
locatable
nameable
typeable
permissionable
valuable
2022-09-28 15:07:39 +00:00
// if non-nil, this type defines new members.
members []TypeSectionMember
2022-08-18 20:56:42 +00:00
}
// EnumMember represents a member of an enum section.
2022-08-24 05:16:44 +00:00
type EnumMember struct {
locatable
nameable
2022-09-04 07:31:35 +00:00
valuable
2022-08-24 05:16:44 +00:00
}
2022-08-21 06:40:04 +00:00
// EnumSection represents an enumerated type section.
type EnumSection struct {
locatable
nameable
typeable
permissionable
members []EnumMember
2022-08-21 06:40:04 +00:00
}
2022-08-23 14:56:37 +00:00
// FaceKind determines if an interface is a type interface or an function
// interface.
type FaceKind int
const (
2022-09-29 19:52:14 +00:00
FaceKindEmpty FaceKind = iota
FaceKindType
FaceKindFunc
)
2022-08-23 14:56:37 +00:00
// FaceBehavior represents a behavior of an interface section.
type FaceBehavior struct {
locatable
nameable
2022-08-23 14:56:37 +00:00
inputs []Declaration
outputs []Declaration
}
// FaceSection represents an interface type section.
type FaceSection struct {
locatable
nameable
permissionable
2022-08-24 22:57:07 +00:00
inherits Identifier
kind FaceKind
2022-09-05 06:04:37 +00:00
behaviors map[string] FaceBehavior
FaceBehavior
2022-08-23 14:56:37 +00:00
}
2022-08-25 16:02:43 +00:00
2022-10-11 15:23:50 +00:00
// Dereference represents a pointer dereference or array subscript.
type Dereference struct {
locatable
valuable
// if a simple dereference was parsed, this should just be zero.
2022-10-11 17:31:17 +00:00
offset uint64
2022-10-11 15:23:50 +00:00
}
// PhraseKind determines what semantic role a phrase plays.
type PhraseKind int
const (
2022-10-25 04:02:24 +00:00
// [name]
PhraseKindCall PhraseKind = iota
// ["name"]
PhraseKindArbitrary
// [+] [-]
PhraseKindOperator
2022-10-25 04:02:24 +00:00
// [= x y]
2022-09-04 00:32:27 +00:00
PhraseKindAssign
2022-10-25 04:02:24 +00:00
// [loc x]
PhraseKindReference
2022-10-25 04:02:24 +00:00
// [cast x T]
2022-10-19 03:32:15 +00:00
PhraseKindCast
2022-10-25 04:02:24 +00:00
// [defer]
PhraseKindDefer
2022-10-25 04:02:24 +00:00
// [if c]
PhraseKindIf
2022-10-25 04:02:24 +00:00
// [elseif]
PhraseKindElseIf
2022-10-25 04:02:24 +00:00
// [else]
PhraseKindElse
2022-10-25 04:02:24 +00:00
// [switch]
PhraseKindSwitch
2022-10-25 04:02:24 +00:00
// [case]
PhraseKindCase
2022-10-25 04:02:24 +00:00
// [while c]
PhraseKindWhile
2022-10-25 04:02:24 +00:00
// [for x y z]
PhraseKindFor
)
// Phrase represents a function call or operator. In ARF they are the same
// syntactical concept.
type Phrase struct {
2022-10-25 05:33:07 +00:00
locatable
2022-09-05 15:49:19 +00:00
returnees []Argument
2022-09-27 18:17:03 +00:00
multiValuable
2022-09-27 18:48:05 +00:00
kind PhraseKind
2022-09-27 18:48:05 +00:00
command Argument
// only applicable for PhraseKindOperator
operator lexer.TokenKind
// only applicable for control flow phrases
block Block
}
2022-08-25 16:02:43 +00:00
// Block represents a scoped/indented block of code.
type Block []Phrase
2022-09-26 22:28:21 +00:00
// FuncOutput represents a function output declaration. It allows for a default
// value.
type FuncOutput struct {
Declaration
valuable
}
2022-08-25 16:02:43 +00:00
// FuncSection represents a function section.
type FuncSection struct {
locatable
nameable
permissionable
2022-08-25 16:02:43 +00:00
receiver *Declaration
inputs []Declaration
2022-09-29 06:29:35 +00:00
outputs []FuncOutput
2022-09-02 05:25:22 +00:00
root Block
external bool
2022-08-25 16:02:43 +00:00
}