代码改变世界

随笔分类 -  编译原理

每门编程语言修复了什么

2013-11-11 10:24 by youxin, 327 阅读, 收藏, 编辑
摘要: Kevin Kelleher suggested an interesting way to compare programming languages: to describe each in terms of the problem it fixes. The surprising thing is how many, and how well, languages can be described this way.Algol:Assembly language is too low-level.Pascal:Algol doesn't have enough data type 阅读全文

静态作用域与动态作用域

2013-11-10 12:06 by youxin, 2658 阅读, 收藏, 编辑
摘要: 看一个问题http://www.zhihu.com/question/20032419词法域是否等同静态作用域?问题来源:《Scheme 程序语言介绍》(http://www.ibm.com/developerworks/cn/linux/l-scheme/part2/)中「一是把 Lisp 从 Dynamic scope 变成了 Lexical scope」词法作用域(lexical scope)等同于静态作用域(static scope)。所谓的词法作用域其实是指作用域在词法解析阶段既确定了,不会改变。我们要知道js是遵循静态作用域的。举个例子:var foo=1;function sta 阅读全文

编译原理Tiny语言的定义

2013-07-19 09:16 by youxin, 2126 阅读, 收藏, 编辑
摘要: Here is the definition for Tiny languageThe Tiny lexicon is as follows:Keywords: IF ELSE WRITE READ RETURN BEGIN END MAIN INT REALSingle-character separators: ; ,()Single-character operators: + -*/Multi-character operators::= == !=Identifier: An identifier consists of a letter followed by any number 阅读全文

编译原理Tiny语言的定义

2013-07-17 10:54 by youxin, 450 阅读, 收藏, 编辑
摘要: Here is the definition for Tiny languageThe Tiny lexicon is as follows:Keywords: IF ELSE WRITE READ RETURN BEGIN END MAIN INT REALSingle-character separators: ; ,()Single-character operators: + -*/Multi-character operators::= == !=Identifier: An identifier consists of a letter followed by any number 阅读全文

Lex入门2

2013-04-08 23:09 by youxin, 1338 阅读, 收藏, 编辑
摘要: lex单词的描述称为模式(Lexical Pattern),模式一般用正规表达式进行精确描述。FLEX通过读取一个有规定格式的文本文件,输出一个如下所示的C语言源程序。FLEX的输入文件称为LEX源文件,它内含正规表达式和对相应模式处理的C语言代码。LEX源文件的扩展名习惯上用.l表示。FLEX通过对源文件的扫描自动生成相应的词法分析函数 int yylex(),并将之输出到名规定为lex.yy.c的文件中。实用时,可将其改名为lexyy.c。该文件即为LEX的输出文件或输出的词法分析器。也可将 int yylex()加入自已的工程文件中使用。2. 模式简介LEX的模式的格式(也称为规则)是机 阅读全文

Lex入门

2013-04-08 22:59 by youxin, 3810 阅读, 收藏, 编辑
摘要: Lex主要功能是生成一个词法分析器(scanner)的 C 源码,描述规则采用正则表达式(regular expression)。描述词法分析器的文件 *.l 经过lex编译后,生成一个lex.yy.c 的文件,然后由 C 编译器编译生成一个词法分析器。词法分析器,简言之,就是将输入的各种符号,转化成相应的标识符(token),转化后的标识符很容易被后续阶段处理,如YACC 或 Bison,过程如图,“lex”和“yacc”这两个名字所代表的也包括这些工具的 GNU 版本 flex 和 bison。 给出的代码应该适用于所有主流版本,比如 MKS yacc。它完全是一个融洽的大家族!Flex 阅读全文

LR分析

2013-03-18 17:53 by youxin, 1518 阅读, 收藏, 编辑
摘要: LR剖析器是一种由下而上(bottom-up)的上下文无关语法剖析器。LR意指由左(Left)至右处理输入字符串,并以最右边优先衍生(Right derivation)的推导顺序(相对于LL剖析器)建构语法树。能以此方式剖析的语法称为LR语法。而在LR(k)这样的名称中,k代表的是剖析时所需前瞻符号(lookahead symbol)的数量,也就是除了目前处理到的输入符号之外,还得再向右参照几个符号之意;省略(k)时即视为LR(1),而非LR(0)。由于LR剖析器尝试由剖析树的叶节点开始,向上一层层透过文法规则的化简,最后推导回到树的根部(起始符号),所以它是一种由下而上的剖析方法。许多程序语 阅读全文

编译原理---递归下降分析法

2013-03-18 11:55 by youxin, 5269 阅读, 收藏, 编辑
摘要: 所谓递归下降法 (recursive descent method),是指对文法的每一非终结符号,都根据相应产生式各候选式的结构,为其编写一个子程序 (或函数),用来识别该非终结符号所表示的语法范畴。例如,对于产生式E′→+TE′,可写出相应的子程序如下:exprprime( ){if (match (PLUS)){advance( );term( );exprprime( );}} 其中: 函数match()的功能是,以其实参与当前正扫视的符号 (单词)进行匹配,若成功则回送true,否则回送false;函数advance()是一个读单词子程序,其功能是从输入单词串中读取下一个单词,并将它赋 阅读全文