Ai
1 Star 1 Fork 1

U语言组织/U语言

forked from 秋来冬风/U语言 
加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
ast.go 3.20 KB
一键复制 编辑 原始数据 按行查看 历史
秋来冬风 提交于 2025-10-27 23:18 +08:00 . feat: buildmode2支持变量遮蔽
package ast2
import (
"fmt"
"strings"
"gitee.com/u-language/u-language/ucom/config"
"gitee.com/u-language/u-language/ucom/data"
"gitee.com/u-language/u-language/ucom/errcode"
"gitee.com/u-language/u-language/ucom/lex2"
)
type Tree struct {
lex lex2.FileToken
//包名
PackageName string
//文件名称
Filename string
//所有节点
Nodes []Node
//错误处理上下文
errctx *errcode.ErrCtx
//符号表
Sbt *Sbt
//变量初始化表
VarInitTable *VarInitTable
varInitTable VarInitTable
//HaveInitFunc 记录是否有自定义init函数
HaveInitFunc *bool
fileHaveInitFunc bool
//C语言头文件用到的节点
CHeaderFile *data.Slice[CDecl]
cHeaderFile data.Slice[CDecl]
//自己及依赖导入的包
ImportPackage *map[string]*Package
importPackage map[string]*Package
//是所有的导入路径
ImporPath *Sbt
originalSbtIndex int
originalSbt []*Sbt
//下面两个字段用于确定是否在函数内解析
Funcinfo *FuncInfo
leftNum int
//inSwitch确定是否在switch代码块内解析
inSwitch stackData
//inFor确定是否在for代码块内解析
inFor stackData
//CheckInfo是专门在语义检查时使用的信息
CheckInfo struct {
//switch表达式的类型
SwitchExprTyp string
//是否要跳过switch代码块
SwitchSkip bool
//检查的符号是否是常量
IsConst bool
//一个函数内的标签
Label []*LabelNode
//一个函数内待检查的goto语句
Goto []*GotoStmt
//生成的临时变量数量
TmpInt int
}
}
func NewTree(l lex2.FileToken, path string, errctx *errcode.ErrCtx, thread bool) *Tree {
//Note:因为目前单个文件不并发解析,所以thread目前没有用处
ret := &Tree{
lex: l,
errctx: errctx,
Sbt: NewSbt(false),
Filename: path,
originalSbt: make([]*Sbt, 1),
ImporPath: NewSbt(false),
}
ret.HaveInitFunc = &ret.fileHaveInitFunc
ret.CHeaderFile = &ret.cHeaderFile
ret.VarInitTable = &ret.varInitTable
ret.ImportPackage = &ret.importPackage
ret.importPackage = map[string]*Package{}
ret.Parser()
return ret
}
func (t *Tree) newTree(sbt *Sbt, lex lex2.FileToken, errctx *errcode.ErrCtx, HaveInitFunc *bool,
VarInitTable *VarInitTable, CHeaderFile *data.Slice[CDecl], ImportPackage *map[string]*Package,
ImporPath *Sbt) {
t.Filename = lex.File
t.errctx = errctx
t.HaveInitFunc = HaveInitFunc
t.Sbt = sbt
t.VarInitTable = VarInitTable
t.CHeaderFile = CHeaderFile
t.ImportPackage = ImportPackage
t.lex = lex
t.ImporPath = ImporPath
}
func (t *Tree) String() string {
var buf strings.Builder
if config.Debug_PrintLex == "on" {
buf.WriteString("lex:\n")
buf.WriteString(t.lex.String())
}
if config.Debug_PrintAst == "on" {
buf.WriteString(fmt.Sprintf("\nPackage:%s\tFileName:%s\n", t.PackageName, t.Filename))
buf.WriteString(fmt.Sprintf("Sbt:%s\n", t.Sbt))
buf.WriteString("\nNodes:\n")
for i := range t.Nodes {
buf.WriteString(fmt.Sprintf("%d:\t%s\n", i, t.Nodes[i].String()))
}
}
return buf.String()
}
type stackData struct {
v []bool
}
func (s *stackData) Push() {
s.v = append(s.v, true)
}
func (s *stackData) Get() bool {
return len(s.v) != 0
}
func (s *stackData) Pop() {
if len(s.v) == 0 {
return
}
s.v = s.v[: len(s.v)-1 : cap(s.v)]
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
Go
1
https://gitee.com/u-language/u-language.git
git@gitee.com:u-language/u-language.git
u-language
u-language
U语言
df767d8a61bb

搜索帮助