注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Code@Pig Home

喜欢背着一袋Code傻笑的Pig .. 忧美.欢笑.记忆.忘却 .之. 角落

 
 
 

日志

 
 

[compiler] lexical analysis and parsing  

2010-09-05 20:38:06|  分类: compiler |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
lexical analysis, 词法分析
把 source file 变成一堆 tokens.
----------------------------------------
a = 10;
b = a * 3;
c = a * b + 5;
----------------------------------------
变成
----------------------------------------
id = num;
id = id op num;
id = id op id op num;
----------------------------------------

parsing, 语法分析
context-free grammar, 上下文无关文法,类似:
----------------------------------------
S -> if E then S else S
S -> begin S L
S -> print E
L -> end
L -> ; S L
E -> num == num
----------------------------------------
每一条,都可以展开成固定的格式,直到某个结束点,比如:L -> end

recursive descent, 递归下降,一种语法分析的算法。说白了就是 switch ... case ... 一直分解到结束。
比如下面的程序分析了上面的语法。
----------------------------------------
enum token { IF, THEN, ELSE, BEGIN, END, PRINT, SEMI, NUM, EQ };
extern enum token getToken(void);

enum token tok;
void advance() { tok = getToken(); }
void eat(enum token t) { if (tok == t) advance(); else error(); }

void S(void) {
    switch (tok) {
    case IF: eat(IF); E(); eat(THEN); S(); eat(ELSE); S(); break;
    case BEGIN: eat(BEGIN); S(); L(); break;
    case PRINT: eat(PRINT); E(); break;
    default: error();
    }
|

void L(void) {
    switch (tok) {
    case END: eat(END); break;
    case SEMI: eat(SEMI); S(); L(); break;
    default: error();
    }
}

void E(void) { eat(NUM); eat(EQ); eat(NUM); }
----------------------------------------
  评论这张
 
阅读(767)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017