- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
C 语言解释器 Parser 剖析器——笔记与心得
C 语言解释器 LittleC 的演示代码
C 语言解释器
C 语言解释器
Interpreter 解释器部分的笔记与心得
C 语言解释器 Parser 剖析器——笔记与心得
longqzh posted @ 2010 年 7 月 08 日 07:25 in Little C Interpreter with tags c 解释器 C 语言解释器 interpreter
读取和分, 1656 阅读 THE LITTLE C INTERPRETER
读取和分
表达式剖析器( THE EXPRESSION PARSER)
析表达式的这部分代码叫做表达式剖析器。毫无疑问,表达 式剖析器是 C 解释器中单一的最重要的部分。 因为 C 语言定
义表达式的方式比其他语言更加粗鄙,所以用大量的代码组 来设计 C 的表达式剖析器。许多商业的编译器用一种由
成的 C
成的 C 源文件来实现表达式剖析器。
有几种不同的方式
parser-generator 创建的 table-driven parser 。尽管
table-driven parser 一般来说要快过其他方式,但却很难手
工构建。为了开发简易的 C 解释器,在这里我们使用递归 继承剖析器( recursive-descent parser. )
个递归 -继承剖析器本质上是一大堆处理表达式的互相
递归的函数。如果是在编译器里,那么剖析器将被用来生成 与源码相符的标准的目标代码。无论如何,在解释器中,剖 析器的目的就是对给定的表达式求值。
将源代码变成他们的组成元素
所有解释器的基础是一个读取源码然后返回下一个逻辑 符号的特殊的函数。基于历史原因,这些逻辑标记一般与标
C 语言,记 (token) 相关联。一般而言,计算机语言,特别是 依据标记来定义程序。你可以想象标记是一个不可见的程序 单元。比如说,相等运算符 == 就是一个标记。这两个等于号 分开后意义将彻底改变。同理 ,if 也是一个标记。在 C
C 语言,
中无论是 i 还是 f 都没有其他意思。
在 ANSI C标准中,标记被定义为属于下列几组:keywordsidentifiers constantsstrings
在 ANSI C
标准中,标记被定义为属于下列几组:
keywords
identifiers constants
strings
operators pinctuation
keywords关键字)是那些如
keywords
关键字)是那些如 while 的构成 C 语言的标
记。 Identifier
记。 Identifier
识别符)是变量、函数、用户定义类型的名
字。而 Constants (常量)和 Strings (字符串)是不解自明
的,就像 operators (运算符)一样。最后 Punctuation (标 等。
点符号)包括了几个项目,像分号,逗号,大括号,小括
点符号)包括了几个项目,像分号,逗号,
大括
号,
小括
在简易 C 解释器中,这个被称作 get_token() 的函数可以
从源码中读取标记。
1234567891011121314151617181920212223242526272 8293031323334353637383940414243444546474849505 1525354555657585960616263646566676869707172737 4757677787980818283848586878889909192939495969 7989910010110210310410510610710810911011111211 3114115116117118119120121122123124125126127128 1291301311321331341351361371381391401411421431
register44145146147148/*Get a token*/get_token(){
register
char *temp;token_type=0;tok=0;temp=token;
char *temp;
token_type=0;tok=0;
temp=token;
*temp=\0;/* skip over white space*/while(iswhite(*prog)amp;amp;*prog)
*temp=\0;
/* skip over white space*/
while(iswhite(*prog)amp;amp;*prog)
++prog;
if (*prog==\r)++prog;++prog;
if (*prog==\r)
++pr
文档评论(0)