• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >Android > 编译器开发系列--Ocelot语言1.抽象语法树,--ocelot语法

编译器开发系列--Ocelot语言1.抽象语法树,--ocelot语法

作者:网友 字体:[增加 减小] 来源:互联网 时间:2017-05-26

网友通过本文主要向大家介绍了编译原理抽象语法树,抽象语法树,抽象语法,抽象语法书,语法的抽象性等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

编译器开发系列--Ocelot语言1.抽象语法树,--ocelot语法


从今天开始研究开发自己的编程语言Ocelot,从《自制编译器》出发,然后再自己不断完善功能并优化。

编译器前端简单,就不深入研究了,直接用现成的一款工具叫JavaCC,它可以生成抽象语法树,抽象语法树是生成中间代码的关键,而中间代码又是生成后端代码的关键。

整个编译器代码采用java语言编写,主要功能是对JavaCC生成的抽象语法树进行语义分析、优化,最后生成优化后的汇编代码,然后再用汇编器对汇编代码汇编生成机器码,最后再用命令链接生成Linux可执行文件,就可以直接在Linux上运行了。

整个编译器采用的语法基本上都是C语言的语法,去除掉一些语法成C语言简化版,而且原项目并无优化。我想做的是在原项目的基础上对其各种优化并使其支持垃圾回收。- -!有的玩了。

抽象语法树和其节点都是继承自Node类。介绍一下Node 类群的继承层次:

再来通过一个简单的helloworld小demo来查看抽象语法树的结构,demo如下所示:

int main(int argc, char **argv)
{
	int i, j = 5;
	if (i) {
		return (j * 1 - j);
	}
	else {
		exit(1);
	}
}

编译器项目运行后生成的抽象语法树如下所示:

<<AST>> (G:\编译原理\自制编译器\源码\test\hello.cb:1)
variables:
functions:
    <<DefinedFunction>> (G:\编译原理\自制编译器\源码\test\hello.cb:1)
    name: "main"
    isPrivate: false
    params:
        parameters:
            <<Parameter>> (G:\编译原理\自制编译器\源码\test\hello.cb:1)
            name: "argc"
            typeNode: int
            <<Parameter>> (G:\编译原理\自制编译器\源码\test\hello.cb:1)
            name: "argv"
            typeNode: char**
    body:
        <<BlockNode>> (G:\编译原理\自制编译器\源码\test\hello.cb:2)
        variables:
            <<DefinedVariable>> (G:\编译原理\自制编译器\源码\test\hello.cb:3)
            name: "i"
            isPrivate: false
            typeNode: int
            initializer: null
            <<DefinedVariable>> (G:\编译原理\自制编译器\源码\test\hello.cb:3)
            name: "j"
            isPrivate: false
            typeNode: int
            initializer:
                <<IntegerLiteralNode>> (G:\编译原理\自制编译器\源码\test\hello.cb:3)
                typeNode: int
                value: 5
        stmts:
            <<IfNode>> (G:\编译原理\自制编译器\源码\test\hello.cb:4)
            cond:
                <<VariableNode>> (G:\编译原理\自制编译器\源码\test\hello.cb:4)
                name: "i"
            thenBody:
                <<BlockNode>> (G:\编译原理\自制编译器\源码\test\hello.cb:4)
                variables:
                stmts:
                    <<ReturnNode>> (G:\编译原理\自制编译器\源码\test\hello.cb:5)
                    expr:
                        <<BinaryOpNode>> (G:\编译原理\自制编译器\源码\test\hello.cb:5)
                        operator: "-"
                        left:
                            <<BinaryOpNode>> (G:\编译原理\自制编译器\源码\test\hello.cb:5)
                            operator: "*"
                            left:
                                <<VariableNode>> (G:\编译原理\自制编译器\源码\test\hello.cb:5)
                                name: "j"
                            right:
                                <<IntegerLiteralNode>> (G:\编译原理\自制编译器\源码\test\hello.cb:5)
                                typeNode: int
                                value: 1
                        right:
                            <<VariableNode>> (G:\编译原理\自制编译器\源码\test\hello.cb:5)
                            name: "j"
            elseBody:
                <<BlockNode>> (G:\编译原理\自制编译器\源码\test\hello.cb:7)
                variables:
                stmts:
                    <<ExprStmtNode>> (G:\编译原理\自制编译器\源码\test\hello.cb:8)
                    expr:
                        <<FuncallNode>> (G:\编译原理\自制编译器\源码\test\hello.cb:8)
                        expr:
                            <<VariableNode>> (G:\编译原理\自制编译器\源码\test\hello.cb:8)
                            name: "exit"
                        args:
                            <<IntegerLiteralNode>> (G:\编译原理\自制编译器\源码\test\hello.cb:8)
                            typeNode: int
                            value: 1

1.<<AST>> 和<<DefinedFunction>> 表示节点的类名。

2.右侧所显示的(G:\编译原理\自制编译器\源码\test\hello.cb:1) 是该节点对应的语法所记载的文件名和行号。

3.缩进表示该节点被前一个节点引用。

 

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 编译器开发系列--Ocelot语言1.抽象语法树,--ocelot语法

相关文章

  • 2017-05-26去除GridView选中时的蓝色背景,gridview选中蓝色
  • 2017-05-26android NDK 教程一(初识JNI--hello world)
  • 2017-05-26Android Studio中使用AIDL进行进程间通信
  • 2017-05-26手机影音2--软件架构分析,影音2--架构分析
  • 2017-05-26Android--线程详解
  • 2017-05-26Android中Handler使用浅析,androidhandler
  • 2017-05-26Android之ViewPager 第二课,androidviewpager
  • 2017-05-26Android通过achartengine画折线图,achartengine折线图
  • 2017-05-26Mac OSX系统搭建React natvie for android 开发环境,osxnatvie
  • 2017-05-26Linux动态链接库加载失败一例

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • Android Studio发布应用
    • Jar mismatch错误的解决,jarmismatch错误
    • Android之侧滑导航栏,android滑导航栏
    • Android触摸事件(一)-AbsTouchEventHandle
    • Android开发学习之路--网络编程之xml、json
    • Json生成与解析,Json生成解析
    • linux设备驱动程序之时钟管理(3)----我的那块儿蛋糕
    • Android Log Tag含义,androidlogtag含义
    • Android 算法 关于递归和二分法的小算法,android二分法
    • 仿网易Tab分类排序控件实现,网易tab排序控件

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有