飞纯技术
  • 主页
  • 相册
  • 关于我
KEEP IN TOUCH

Posts tagged ast

fInterpretor中静态语义检查的实现

四27
2008
Leave a Comment Written by Filia.Tao

这几天在解释器fInterpretor 中加入了静态语义检查

静态语义检查分为下面几个方面:

  1. 名字检查
    • 类型名
    • 函数名
    • 变量名
  2. 类型匹配检查
    • 各种运算 (比如算术,逻辑)的类型约束
    • 函数调用实参和形参的类型匹配
    • 函数实际返回类型和声明的返回类型是否匹配
  3. 变量初始化检查 (非必须)
    • 检查局部变量在引用前是否已经初始化 (尚未实现)
现在基本对L1 语言做好了上述的检查, 中间做了好多弯路.
主要是在进行静态类型检查的时候在类型约束信息放在哪里的这个问题上一开始做了错误的选择,过度依赖Python的语言特性修饰器,动态的添加类型约束到一个统一的地方.
最终的选择还是比较”分布式的”, 每个类型定义一个 do_type_trans(self, op_name, arg = None) 方法对各种操作进行类型约束检查,同时返回对应操作后正确的类型(类型计算), 这样还有一个好处就是将”类型计算”的逻辑移动到类型定义文件中,而不是写在ASTAction 中.
嗯.基本就是这样了. 争取在5.1前把这些加入到L2语言中. 还有更重要的就是测试了. 特别是需要覆盖测试,测试目标语言的各种特性是否被正确实现了.
Posted in compiler, python - Tagged compiler, fInterpretor, python, type, 类型检查

yacc,ast and graphviz

六15
2007
1 Comment Written by Filia.Tao

这几天忙着写编译原理课程设计的另一部分. Seu YACC的实现.

这个程序的核心算法实现不是有我来完成,我负责后端输出的模板代码的书写.

实际上就是一个基于LALR分析表的parser.

我附带加上了生成抽象语法树的功能, 并输出DOT 文件,通过graphviz 生成图片.

下面贴一段Min-C 语言的抽象语法树.(图片比较大)

ast.png

对应的代码为

int main ( )
{
int x = 0 ;
int b = 2 ;
int c = 5 ;
int d = 6 ;
int a = b ;
if ( x < y )
{
int x = y ;
}
while ( c == d )
{
int m = c + d ;
m = x + y ;
}
}

Posted in compiler - Tagged compiler, graphviz, yacc

授权方式

Creative Commons License
本站作品采用
知识共享署名-非商业性使用-相同方式共享 3.0 许可协议
进行许可。

最近评论

  • carlos 发表在《yacc,ast and graphviz》
  • xiang 发表在《关于我》
  • healthy green tea 发表在《debian 同步系统时间》
  • Filia.Tao 发表在《Kinper – A Kindle Helper Service》
  • pensz 发表在《厦门行简单记录》

My Tweets

RSS My KnowHowSpot

标签

指令 汇编 算法 计算机科学 2008 amazon android ast boto C++ C/C++ compiler Computer design-pattern DFA Django ezengage Firefox github google GSoc http imagedownload iterator javascript jquery kindle kinper lex life Linux locationbar Mix opensource proxy python s3 S5Creator shanghai slide STL vector vista web Web开发

分类

  • ideas (2)
  • job (2)
  • life (2)
  • notes (1)
  • opensource (38)
    • Firefox (17)
    • GSoc (7)
    • Linux (13)
  • project (3)
  • 生活 (3)
  • 编程开发 (67)
    • C/C++ (4)
    • GAE (1)
    • http (2)
    • javascript (24)
    • python (20)
    • Web开发 (12)
    • 端口映射工具的实现 (6)
  • 计算机科学 (23)
    • compiler (17)
      • lex (11)
    • 算法 (5)
  • 随便写写 (67)

文章归档

Blogroll

  • 11′s SKY
  • 86's world
  • Filia’s Summer Of Code
  • limodou的学习记录
  • Loki
  • MyAllBlue
  • perol’s blog
  • Realazy
  • 一个藏袍
  • 人猿星球
  • 冰古Blog
  • 刀枪Blue
  • 懶懶喵日記
  • 桑林志
  • 白菜
  • 车东[Blog^2]
  • 释翼的天空
  • 阿文的自留地

开源网站

  • beagle
  • linuxsir
  • sourceforge
  • 中国Linux 公社
  • 啄木鸟社区

我的项目

  • ezEngage
  • KnowHowSpot

EvoLve theme by Theme4Press  •  Powered by WordPress 飞纯技术