从lex&yacc说到编译器(1.正则表达式)
学过编译原理的朋友肯定都接触过LEX这个小型的词法扫描工具. 但是却很少有人真正把LEX用在自己的程序里. 在构造专业的编译器的时候,常常需要使用到lex和yacc. 正是因为这两个工具,使得我们编写编译器,解释器等工具的时候工作变得非常简单.不过话说回来,会使用lex和yacc的人也确实不简单. Lex和yacc里面牵涉到一系列的编译原理的理论知识,不是简单地看看书就能搞懂的. 本文只是简单地介绍一下lex和yacc的使用方法.相关编译原理请查看本科教材.
国内大学教材里面对于lex和yacc的介绍很少,有些根本就没有,不过在国外的编译原理教材介绍了很多. 按照学科的分类,国内大学本科里面开的<<;编译原理>>教程只是讲解编译的原理,并不讲解实践. 而对于实践方面则是另外一门学科<<;编译技术>>. 关于编译技术的书籍在国内是少之又少. 前不久, 听说上海交大的计科内部出版过编译技术的教材.可惜我们这些人就无法得见了. 还好,机械工业出版社引进了美国Kenneth C.Louden所著的经典著作<<;编译原理及实践>>中,比较详细地介绍lex和yacc的使用.
Lex属于GNU内部的工具,它通常都是gcc的附带工具. 如果你使用的Linux操作系统,那么肯定系统本身就有lex和yacc,不过yacc的名字变成了bison. 如果你使用的Windows操作系统,那么可以到cygwin或者GNUPro里面得到. 网上也有windows版本lex和yacc,大家可以自己去一.
本文一共有两篇,一篇是介绍lex,另一篇是介绍yacc. Lex和yacc搭配使用, 我们构造自己的编译器或者解
释器就如同儿戏. 所以我把本文的名字叫做黄金组合.
本文以flex( Fase Lex)为例,两讲解如何构造扫描程序.
l1正则化的作用Flex可以通过一个输入文件,然后生成扫描器的C源代码.
其实扫描程序并不只用于编译器.比如编写游戏的脚本引擎的时候,我看到很多开发者都是自己写的扫描器,其算法相当落后(完全没有DFA的概念化), 甚至很多脚本引擎开发者的词法扫描器都没有编写,而是在运行过程中寻token(单词). 在现代的计算机速度确实可以上小型的脚本引擎在运行中进行词法扫描, 但是作为一个合格的程序员, 或者说一个合格的计算机本科毕业生而来说, 能够运用编译原理与技术实践,应该是个基本要求.
如果要说到词法分析的扫描器源代码编写, 其实也很简单, 会C语言的人都会写. 可是Kenneth Louden在<<;编译原理及技术>里面,花了50多页,原因就是从理论角度,介绍标准的,可扩展的,高效的词法扫描器的编写. 里面从正则表达式介绍到DFA(有穷自动机),再到NFA(非确定性有穷自动机),最后才到代码的编写. 以自动机原理编译扫描器的方法基本上就是现在词法扫描器的标准方法, 也就是Lex使用的方法. 在Lex中,我们甚至不需要自己构造词法的DFA, 我们只需要把相应的正则表达式输入, 然后lex能够为我们自己生成DFA,然后生成源代码,可谓方便之极.
本文不讲DFA, lex的输入是正则表达式, 我们直接先看看正则表达式方面知识就可以了.
1.正则表达式(regular expression):
对于学过编译原理的朋友来说,这一节完全可以不看.不过有些东西还是得注意一下,因为在flex中的正则表达式的使用有些具体的问题是在我们的课本上没有说明的.
先看看例子:
例1.1
name Tangl_99
这就是定义了name这个正则表达式,它就等于字符串Tangl_99.所以,如果你的源程序中出现了Tangl_99这个字符传,那么它就等于出现一次name正则表达式.
例1.2
digit 0|1|2|3|4|5|6|7|8|9
这个表达式就是说,正则表达式digit就是0,1,2,…,9中的某一个字母.所以无论是0,2,或者是9…都是属于digit这个正则表达式的.
“|”符号表示“或者”的意思.
那么定义正则表达式name Tangl_99|Running,同样的,如果你的源程序中出现了Tangl_99或者Running,那么就等于出现了一次name正则表达式.
例1.3
one 1*
“*”符号表示“零到无限次重复”
那么one所表示的字符串就可以是空串(什么字符都没有), 1, 11, 111, 11111, 11111111111, 11111111…等等.总之,one就是由0个或者N个1所组成(N可以为任意自然数).
与”*”相同的有个”+”符号.请看下面的例子1.4
例1.4
realone 1+
“+”符号表示“1到无限次重复”
那么realone和one不同的唯一一点就是,realone不包含空串,因为”+”表示至少一次重复,那么realone至少有一个1.所以realone所表达的字符串就是1,11,111, 1111, 11111…,等等.
例1.5
digit [0-9]
letter [a-zA-Z]
这里的digit等于例1.2中的digit,也就是说,a|b|c就相当于[a-c].
同理,letter也就是相当于a|b|c|d|e|f|…|y|z|A|B|C|D…|Z 不过注意的一点就是,你不能把letter 写成[A-z],而必须大写和小写都应该各自写出来.
例1.6
notA[^A]
“^”表示非,也就是除了这个字符以外的所有字符
所以notA表示的就是除了A以外的所有字符.
下面让我们来看看一些一般高级程序语言中常用的综合例子.
digit [0-9]
number {digit}+
letter [a-zA-Z_]
digit前面多次提起过,就是0-9的阿拉伯数字.number就是所有的数字组合,也就是整数. Letter前面也提起过,唯一不同的就是多了一个下划线.因为一般我们的C语言中容许有下划线来表示定义的变量名,所以我也把下划线当成英语字母来处理了.
这里number中使用上面定义的digit正则表达式.在lex中,用{digit}就是表示正则表达式digit.
newline [\n]
whitespace [ \t]+
newline就是提行的意思.这里我们使用的是\n这个符号,它和C语言中表示提行号一致.问题是大家可能要问到为什么要使用[]符号.因为在lex中,如果你使用[],那么里面表示的肯定就是单个字符号,而不会被理解成”\”和”n”两个字符.
Whitespace就是空格符号的意思.一般的高级程序语言中有两种,一种就是简单的空格,还有一种就是\t制表符.使用了”+”符号,就表示了这些空白符号的无限组合.
总黄酮
生物总黄酮是指黄酮类化合物,是一大类天然产物,广泛存在于植物界,是许多中草药的有效成分。在自然界中最常见的是黄酮和黄酮醇,其它包括双氢黄(醇)、异黄酮、双黄酮、黄烷醇、查尔酮、橙酮、花苷及新黄酮类等。
简介
近年来,由于自由基生命科学的进展,使具有很强的抗氧化和消除自由基作用的类黄酮受到空前的重视。类黄酮参与了磷酸与花生四烯酸的代谢、蛋白质的磷酸化、钙离子的转移、自由基的清除、抗氧化活力的增强、氧化还原作用、螯合作用和基因的表达。它们对健康的好处有:(  1 )抗炎症(  2 )抗过敏(  3 )抑制细菌(  4 )抑制寄生虫(  5 )抑制病毒(  6 )防治肝病(7 )防治血管疾病(8 )防治血管栓塞(9 )防治心与脑血管疾病(10 )抗肿瘤(11 )抗化学毒物等。天然来源的生物黄酮分子量小,能被人体迅速吸收,能通过血脑屏障,能时入脂肪组织,进而体现出如下功能:消除疲劳、保护血管、防动脉硬化、扩张毛细血管、疏通微循环、活化大脑及其他脏器细胞的功能、抗脂肪氧化、抗衰老。近年来国内外对茶多酚、银杏类黄酮等的药理和营养性的广泛深入的研究和临床试验,证实类黄酮
既是药理因子,又是重要的营养因子为一种新发现的营养素,对人体具有重要的生理保健功效。目前,很多著名的抗氧化剂和自由基清除剂都是类黄酮。例如,茶叶提取物和银杏提取物。葛根总黄酮在国内外研究和应用也已有多年,其防治动脉硬化、治偏瘫、防止大脑萎缩、降血脂、降血压、防治糖尿病、突发性耳聋乃至醒酒等不乏数例较多的临床报告。从法国松树皮和葡萄籽中提取的总黄酮" 碧萝藏"-- (英文称PYCNOGENOL )在欧洲以不同的商品名实际行销应用25 年之久,并被美国FDA 认可为食用黄酮类营养保健品,所报告的保健作用相当广泛,内用称之为" 类维生素" 或抗自由基营养素,外用称之为" 皮肤维生素" 。进一步的研究发现碧萝藏的抗氧化作用比VE 强50 倍,比VC 强20 倍,而且能通过血脑屏障到达脑部,防治中枢神经系统的疾病,尤其对皮肤的保健、年轻化及血管的健康抗炎作用特别显著。在欧洲碧萝藏已作为保健药物,在美国作为膳食补充品(相当于我国的保健食品),风行一时。随着对生物总黄酮与人类营养关系研究的深入,不远的将来可能证明黄酮类化合物是人类必需的微营养素或者是必需的食物因子。性状:片剂。
功能主治与用法用量
功能主治:本品具有增加脑血流量及冠脉血流量的作用,可用于缓解高血压症状(颈项强痛)、心绞痛及突发性耳聋,有一定疗效。用法及用量:口服:每片含总黄酮60mg,每次5片,1日3次。
不良反应与注意
不良反应和注意:目前,暂没有发现任何不良反应.
洛伐他丁
【中文名称】:洛伐他丁
【英文名称】:Lovastatin
【化学名称】:(S)-2-甲基丁酸-(1S,3S,7S,8S,8aR)-1,2,3,7,8,8a-六氢-3,7-二甲基
-8-[2-(2R,4R)-4-羟基-6氧代-2-四氢吡喃基]-乙基]-1-萘酯
【化学结构式】:
洛伐他丁结构式
【作用与用途】洛伐他丁胃肠吸收后,很快水解成开环羟酸,为催化胆固醇合成的早期限速酶(HMG -coA还原酶)的竞争性抑制剂。可降低血浆总胆固醇、低密度脂蛋白和极低密度脂蛋白的胆固醇含量。亦可中度增加高密度脂蛋白胆固醇和降低血浆甘油三酯。可有效降低无并发症及良好控制的糖尿病人的高胆固醇血症,包括了胰岛素依赖性及非胰岛素依赖性糖尿病。
【用法用量】口服:一般始服剂量为每日20mg,晚餐时1次顿服,轻度至中度高胆固醇血症的病人,可以从10mg开始服用。最大量可至每日80mg。
【注意事项】①病人既往有肝脏病史者应慎用本药,活动性肝脏病者禁用。②副反应多为短暂性的:胃肠胀气、腹泻、便秘、恶心、消化不良、头痛、肌肉疼痛、皮疹、失眠等。③洛伐他丁与香豆素抗凝剂同时使用时,部分病人凝血酶原时间延长。使用抗凝剂的病人,洛伐他丁前后均应检查凝血酶原时间,并按使用香豆素抗凝剂时推荐的间期监测。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。