tm 转易语言实现文件管理器器怎么改y语言

温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
文本挖掘被描述为“自动化或半自动规划处理文本的过程”,包含了文档聚类、文档分类、自然语言处理、文体变化分析及网络万巨额等领域内容。 对于文本处理过程首先要拥有分析的语料(text corpus),比如报告、信函、出版物等而后根据这些语料建立半结构化的文本库(text database)。而后生成包含词频的结构化的词条-文档矩阵(term-document matrix) 这个一般性数据结构会被用于后续的分析,比如: 1)文本分类,比如根据现有的文本分类情况,对未知文本进行归类: 2)语法分析; 3) 信息提取和修复 4) 文档信息汇总,比如提取相关有代表性的关键词、句子等。文本挖掘相关的R程序包:tm、lsa、RTextTools、textcat、corpora、zipfRmaxent、TextRegression、wordcloud词干化(stemming):比如我们要识别cat这个字符,但还可能有catlike、catty、cats等词,需要进行词干化记号化(Tockenization):将一段文本分割成叫做token(象征)过程,token可能是单词、短语、符号或其他有意义的元素。library(Snowball)& SnowballStemmer(c('functions', 'stemming', 'liked', 'doing'))[1] "function" "stem" "like" "do"& NGramTokenizer(' 中华人民共和国成立于1949年')[1] "中华人民共和国成立于" "成立于1949年" "中华人民共和国成立"[4] "成立于" "于1949年" "中华人民共和国"[7] "成立" "于" "1949年"中文分词Rwordseg这个包,即调用了java分词程序对语句进行分词。library(Rwordseg)segmentCN('花儿为什么这样红')[1] "花儿" "为什么" "这样" "红"1、tm包1)数据读入:在tm 中主要的管理文件的结构被称为语料库(Corpus),代表了一系列的文档集合。语料库是一个概要性的概念,在这里分为动态语料库(Volatile Corpus,作为R 对象保存在内存中)和静态语料库(Permanent Corpus,R 外部保存)。在语料库构成中,x 必须有一个说明资料来源(input location)的源对象(Source Object)。我们可以看一下tm 中Corpus(或VCorpus)函数的用法,对于动态语料库:Corpus(x, readerControl = list(reader = x$DefaultReader, language = "en"), ...)在tm 中静态语料库也是可以处理的,但需要使用filehash 包来支持:&PCorpus(x, readerControl = list(reader = x$DefaultReader, language = "en"),&dbControl = list(dbName = "", dbType = "DB1"), ...)对于这些资料来源(即x),tm 包提供了一些相关的函数,比如&DirSource:处理目录&VectorSource:由文档构成的向量&DataframeSource:数据框,就像CSV 文件减少对内存的要求,但数据的访问会受到硬盘的读写能力限制。比如,txt 目录下的包含拉丁字符的纯文本,内容是罗马诗人奥维德Ovid 的诗集,可以这样读进来:&& txt &- system.file("texts", "txt", package = "tm")&& (ovid &- Corpus(DirSource(txt), readerControl = list(language = "lat")))&A corpus with 5 text documents当然同样也可以从字符向量创建语料库:& docs &- c("This is a text.", "This another one.")& Corpus(VectorSource(docs))&A corpus with 2 text documents最后我们根据路透社文档创建一个语料库,用于后续示例:& reut21578 &- system.file("texts", "crude", package = "tm")&& reuters &- Corpus(DirSource(reut21578), readerControl = list(reader = readReut21578XML))&& reuters&A corpus with 20 text documents&你在R 中创建了一个语料库,但硬盘上并没有,那么使用writeCorpus() 函数保存。2)数据输出& writeCorpus(ovid)这时,在工作目录下会生成与语料库对应的多个纯文本文件3)语料库的提取对于print() 和summary() 函数依然有效,但源信息被隐藏(可以想象一下每个语料库包含了大量的文本,就像数据库一样)。summary() 函数会提供更多的元数据(meta data)信息,完整信息的提取需要使用inspect(),比如:& inspect(ovid[1:2])A corpus with 2 text documentsThe metadata consists of 2 tag-value pairs and a data frameAvailable tags are:create_date creatorAvailable variables in the data frame are:MetaID$ovid_1.txtSi quis in hoc artem populo non novit amandi,hoc legat et lecto carmine doctus amet.arte citae veloque rates remoque moventur,arte leves currus: arte regendus amor.curribus Automedon lentisque erat aptus habenis,Tiphys in Haemonia puppe magister erat:me Venus artificem tenero praefecit ATiphys et Automedon dicar Amoris ego.ille quidem ferus est et qui mihi saepe repugnet:sed puer est, aetas mollis et apta regi.Phillyrides puerum cithara perfecit Achillem,atque animos placida contudit arte feros.qui totiens socios, totiens exterruit hostes,creditur annosum pertimuisse senem.$ovid_2.txtquas Hector sensurus erat, poscente magistroverberibus iussas praebuit ille manus.Aeacidae Chiron, ego sum praeceptor Amoris:saevus uterque puer, natus uterque dea.sed tamen et tauri cervix oneratur aratro,frenaque magnanimiet mihi cedet Amor, quamvis mea vulneret arcupectora, iactatas excutiatque faces.quo me fixit Amor, quo me violentius ussit,hoc melior facti vulneris ultor ero:non ego, Phoebe, datas a te mihi mentiar artes,nec nos a?riae voce monemur avis,nec mihi sunt visae Clio Cliusque sororesservanti pecudes vallibus, Ascra, tuis:usus opus movet hoc:对于单个文档的提取需要使用[[,当然既可以通过位置也可以通过名称:&& identical(ovid[[2]], ovid[["ovid_2.txt"]])&[1] TRUE&4)信息转化 一旦创建了语料库,后续文档修改则不可避免,比如填充、停止词去除。在tm包里,这些函数都归到信息转化里面,其主要函数就是tm_map(),这个函数可以通过maps方式将转化函数实施到每一个语料上。5)转化为纯文本 在reuters这个语料库中保存的是XML格式的文本,XML格式文本没分析的意义,我们只需要使用其中的文本内容。这个操作可以使用as.PlainTextDocument()函数来实现reuters &-tm_map(reuters,as.PlainTextDocument)注意,另外一种方式是使用readReut21578XMLasPlain读取方式,那么在第一步即为纯文本格式a)取出多余的空白通过:reuters&-tm_map(reuters,stripWhitespace)b)小写变化通过:reuters &-tm_map(reuters,tolower)c) 停止词去除通过:reuters&-tm_map(reuters,removeWords,stopwords("english"))d) 填充通过以下方式,需要Snowball包(并行计算)支持:&tm_map(reuters,stemDocument)A corpus with 20 text documents6)过滤有时候,我们需要选取给定条件下的文档。tm_filter函数即为这个目的设计。sFilter适应于一般情况下的用户自定义过滤情况:它整合了适用于元数据的最小查询语句。假如需要找出ID等于237,表头(heading)包含“INDONESIA SEEN AT CROSSROADS OVERECONOMIC CHANGE” 字符的文本本舰。& query &- "id == '237' &&+ heading == 'INDONESIA SEEN AT CROSSROADS OVER ECONOMIC CHANGE'"&& tm_filter(reuters, FUN = sFilter, query)&A corpus with 1 text document&也可以进行全文过滤&& tm_filter(reuters, pattern = "company")&A corpus with 5 text documents&& tm_filter(reuters, FUN = searchFullText, "company")&A corpus with 5 text documents&7)元数据管理 元数据是为了标记语料库的附加信息,最简单的使用范式就是调用meta()函数 .文档会被预先被定义一些属性,比如作者信息,但也可能是任意自定义的元数据标签。这些附加的元数据标签都是独立的附加在单个文档上。从语料库的视角上看,这些元数据标签被独立的存储在每个文档上。除了meta()函数外,DublinCore()函数提供了一套介于SimpleDublin Core元数据和tm元数据之间的映射机制,用于画的或设置文档的元数据信息。比如:& DublinCore(crude[[1]], tag = "creator") &- "Ano Nymous"& DublinCore(crude[[1]])Simple Dublin Core meta data pairs are:Title : DIAMOND SHAMROCK (DIA) CUTS CRUDE PRICESCreator : Ano NymousSubject :Description:Publisher :Contributor:Date :
17:00:56Type :Format :Identifier : 127Source :Language : enRelation :Coverage :Rights :& meta(crude[[1]])Available meta data pairs are:Author : Ano NymousDateTimeStamp:
17:00:56Description :Heading : DIAMOND SHAMROCK (DIA) CUTS CRUDE PRICESID : 127Language : enOrigin : Reuters-21578 XMLUser-defined local meta data pairs are:$TOPICS[1] "YES"$LEWISSPLIT[1] "TRAIN"$CGISPLIT[1] "TRAINING-SET"$OLDID[1] "5670"$Topics[1] "crude"$Places[1] "usa"$Peoplecharacter(0)$Orgscharacter(0)$Exchangescharacter(0)上面讲到的一些示例只是针对于文档级别的元数据管理。实际上在tm 包元数据管理体系中,元数据标签对应了两个level:. 对于语料库(corpus)级别:文档的集合. 单个文档的元数据后一种元数据的使用主要是由于一些性能原因,或者是由于一些分析上的需要,比如要对文档进行分类(注意是classification),分类的结果直接和每个文档的标记有关系。& meta(crude, tag = "test", type = "corpus") &- "test meta"& meta(crude, type = "corpus")$create_date[1] " 07:32:26 GMT"$creatorLOGNAME"feinerer"$test[1] "test meta"& meta(crude, "foo") &- letters[1:20]& meta(crude)MetaID foo1 0 a2 0 b3 0 c4 0 d5 0 e6 0 f7 0 g8 0 h9 0 i10 0 j11 0 k12 0 l13 0 m14 0 n15 0 o16 0 p17 0 q18 0 r19 0 s20 0 t8)标准操作和函数对于语料库来说,其标准操作和函数和R 的一般函数非常类似,比如[, [&-, [[, [[&-, c(), lapply()对于像c()这这个函数即是连接多个语料库的意思。连接之后,元数据信息也会被更新。9)创建词条-文档关系矩阵文本挖掘的要创建词条-文档关系矩阵,它是后续构建模型的基础。假设我们有两个文档分别是text mining is funny 和a text is a sequence of words,那么对应的矩阵为:a funny is mining of sequence text words1 0 1 1 1 0 0 1 02 2 0 1 0 1 1 1 1在tm 包里,根据词条、文档分别作为行、列或反之,对应有TermDocumentMatrix 和DocumentTermMatrix 两类稀疏矩阵,下面我们看一个例子:& dtm &- DocumentTermMatrix(reuters)& inspect(dtm[1:5,100:105])A document-term matrix (5 documents, 6 terms)Non-/sparse entries: 1/29Sparsity : 97%Maximal term length: 10Weighting : term frequency (tf)TermsDocs abdul-aziz ability able abroad, abu accept127 0 0 0 0 0 0144 0 2 0 0 0 0191 0 0 0 0 0 0194 0 0 0 0 0 0211 0 0 0 0 0 010)对词条-文档关系矩阵操作实际上对于矩阵的操作R 有大量的函数(比如聚类、分类算法等)支持,但这个包还是提供了一些常用的函数支持。假如需要找出发生5 次以上的条目,可以使用findFreqTerms() 函数:& findFreqTerms(dtm, 5)[1] "15.8" "accord" "agency" "ali"[5] "analysts" "arab" "arabia" "barrel."[9] "barrels" "bpd" "commitment" "crude"[13] "daily" "dlrs" "economic" "emergency"[17] "energy" "exchange" "exports" "feb"[21] "futures" "government" "gulf" "help"[25] "hold" "international" "january" "kuwait"[29] "march" "market" "meeting" "minister"[33] "mln" "month" "nazer" "nymex"[37] "official" "oil" "opec" "output"[41] "pct" "petroleum" "plans" "posted"[45] "price" "prices" "prices." "production"[49] "quoted" "recent" "report" "reserve"[53] "reserves" "reuter" "saudi" "sheikh"[57] "sources" "study" "traders" "united"[61] "west" "world"或者找到相关性,比如对于opec,找到相关系数在0.8 以上的条目,使用findAssocs():& findAssocs(dtm, "opec", 0.8)opec prices. 15.81.00 0.81 0.80这个函数还可以接受一般的矩阵。对于一般矩阵,会将矩阵直接转化为相关阵,这种方式可以实现不同的相关计算方式。词条-文档关系矩阵一般都是非常庞大的数据集,因此这里提供了一种删减稀疏条目的方法,比如有些条目尽在很少的文档中出现。一般来说,这样做不会对矩阵的信息继承带来显著的影响。& inspect(removeSparseTerms(dtm, 0.4))A document-term matrix (20 documents, 3 terms)Non-/sparse entries: 55/5Sparsity : 8%Maximal term length: 6Weighting : term frequency (tf)TermsDocs march oil reuter127 0 3 1144 0 4 1191 0 2 1194 0 1 1211 0 2 1236 2 6 1237 1 2 1242 1 3 1246 1 2 1248 1 8 1273 1 5 1349 1 4 1352 1 4 1353 1 4 1368 1 3 1489 1 5 1502 1 5 1543 1 3 1704 1 1 1708 1 2 1这个函数去除了低于40% 的稀疏条目项。11)字典字典是一个字符集合。经常用于在文本挖掘中展现相关的词条时。使用Dictionary() 函数实现,可以看示例:& (d &- Dictionary(c("prices", "crude", "oil")))[1] "prices" "crude" "oil"attr(,"class")[1] "Dictionary" "character"当将字典传递到DocumentTermMatrix() 以后,生成的矩阵会根据字典提取计算,而不是漫无目的地全部提取。& inspect(DocumentTermMatrix(reuters, list(dictionary = d)))A document-term matrix (20 documents, 3 terms)Non-/sparse entries: 41/19Sparsity : 32%Maximal term length: 6Weighting : term frequency (tf)TermsDocs crude oil prices127 2 3 3144 0 4 2191 3 2 0194 4 1 0211 0 2 0236 1 6 2237 0 2 0242 0 3 1246 0 2 0248 0 8 5273 6 5 4349 2 4 0352 0 4 2353 2 4 1368 0 3 0489 0 5 2502 0 5 2543 3 3 3704 0 1 2708 1 2 0
阅读(5681)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
在LOFTER的更多文章
loftPermalink:'',
id:'fks_',
blogTitle:'R语言环境下的文本挖掘---tm包',
blogAbstract:'\t文本挖掘被描述为“自动化或半自动规划处理文本的过程”,包含了文档聚类、文档分类、自然语言处理、文体变化分析及网络万巨额等领域内容。\t对于文本处理过程首先要拥有分析的语料(text corpus),比如报告、信函、出版物等而后根据这些语料建立半结构化的文本库(text database)。而后生成包含词频的结构化的词条-文档矩阵(term-document matrix)\t这个一般性数据结构会被用于后续的分析,比如:',
blogTag:'',
blogUrl:'blog/static/',
isPublished:1,
istop:false,
modifyTime:0,
publishTime:5,
permalink:'blog/static/',
commentCount:0,
mainCommentCount:0,
recommendCount:1,
bsrk:-100,
publisherId:0,
recomBlogHome:false,
currentRecomBlog:false,
attachmentsFileIds:[],
groupInfo:{},
friendstatus:'none',
followstatus:'unFollow',
pubSucc:'',
visitorProvince:'',
visitorCity:'',
visitorNewUser:false,
postAddInfo:{},
mset:'000',
remindgoodnightblog:false,
isBlackVisitor:false,
isShowYodaoAd:false,
hostIntro:'',
hmcon:'0',
selfRecomBlogCount:'0',
lofter_single:''
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}后使用快捷导航没有帐号?
R语言tm工具包进行文本挖掘实验
查看: 12598|
评论: |原作者: winbo
摘要: tm包是R语言中为文本挖掘提供综合性处理的package,进行操作前载入tm包,vignette命令可以让你得到相关的文档说明。本文从数据导入、语料库处理、预处理、元数据管理、创建term-document矩阵这几个方面讲述tm包括的使 ...
tm包是R语言中为文本挖掘提供综合性处理的package,进行操作前载入tm包,vignette命令可以让你得到相关的文档说明。本文从数据导入、语料库处理、预处理、元数据管理、创建term-document矩阵这几个方面讲述tm包括的使用。
& & &library(tm)& && &&&//使用默认安装的R平台是不带tm&&package的,必须要到网站下载package. 值得注意的是:tm package很多函数也要依赖于其它的一些package,所以在这个网站,应该把rJava,Snowball,zoo,XML,slam,Rz,Rweka,matlab这些win32 package一并下载,并解压到默认的library中去。
& & &vignette("tm")& &//会打开一个tm.pdf的英文文件,讲述tm& &package的使用及相关函数
1、Data-import:
& & &&&txt &- system.file("texts", "txt", package = "tm")& && && & //是为将目录C:\Program Files\R\R-2.15.1\library\tm\texts\txt 记入txt变量
& & & (ovid &- Corpus(DirSource(txt),readerControl = list(language = "lat")))&&//即将txt目录下的5个文件Corpus到Ovid去,language = "lat"表示the directory txt containing Latin (lat) texts
& && &此外,VectorSource is quite useful, as it can create a corpus from character vectors, e.g.:
& & & docs &- c("This is a text.", "This another one.")
& & & Corpus(VectorSource(docs)) & &&&//A corpus with 2 text documents
& & 在本部分中,我们Finally create a corpus for some Reuters documents as example for later use
& & & reut21578 &- system.file("texts", "crude", package = "tm")
& & & reuters &- Corpus(DirSource(reut21578),readerControl = list(reader = readReut21578XML))&&// 在这一部分中,将目录C:\Program Files\R\R-2.15.1\library\tm\texts\crude下的20个XML文件Corpus成reuters,要用到XML package(前面已经下载了).
& & & inspect(ovid[1:2])& && &//会出现以下的显示,当然identical(ovid[[2]], ovid[["ovid_2.txt"]])==true,所以inspet(ovid["ovid_1.txt","ovid[ovid_2.txt]"])效果一样:
& && && && &[attach]42940[/attach]
2、Transmation:
& && reuters &- tm_map(reuters, as.PlainTextDocument)& & //This can be done by converting the documents to plain text documents.即去除标签
& && reuters &- tm_map(reuters, stripWhitespace)& && && && &&&//去除空格
& && reuters &- tm_map(reuters, tolower)& && && && && && && && && && &//将内容转换成小写
& && reuters &- tm_map(reuters, removeWords, stopwords("english"))& & &&// remove stopwords
& & 注:在这里需要注意的是,如果使用中文分词法,由于词之间无有像英文一样的空隔,好在有Java已经解决了这样的问题,我们只需要在R-console里加载rJava与rmmseg4j两个工具包即可。如
& & &mmseg4j("中国人民从此站起来了")
& && &[1] 中国&&人民&&从此&&站&&起来
3、Filters:
& && query &- "id == '237' & heading == 'INDONESIA SEEN AT CROSSROADS OVER ECONOMIC CHANGE'"& &&&//query其实是一个字符串,设定了一些文件的条件,如
& && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && && & //id==237, 标题为:indonesia seen at c.........
& && tm_filter(reuters, FUN = sFilter, query)& && & //&&A corpus with 1 text document,这个从数据中就可以看得出来。
4、Meta data management
& & & DublinCore(crude[[1]], "Creator") &- "Ano Nymous"& && &//本来第一个XML文件中是不带作者的,此语句可以改变一些属性的值,类比其它。
& & & meta(crude[[1]])& && && && && && && && && && && && && && && && && && && && && && & //显示第一个文件的元素信息数据得到下图
[attach]42941[/attach]
& &&&& meta(crude, tag = "test", type = "corpus") &- "test meta"
& &&&& meta(crude, type = "corpus")& && && && && && && & 改变元素后显示如下
& && && && &[attach]42942[/attach]
5、Creating Term-Document Matrices
& && && dtm &- DocumentTermMatrix(reuters)
& && && inspect(dtm[1:5, 100:105])& && && & //显示如下:
& && && && && && && &&&A document-term matrix (5 documents, 6 terms)
& && && && && && && &&&Non-/sparse entries: 1/29
& && && && && && && &&&Sparsity : 97%
& && && && && && && &&&Maximal term length: 10
& && && && && && && &&&Weighting : term frequency (tf)
& && && && && && && &&&Terms
& && && && && && && &&&Docs abdul-aziz ability able abroad, abu accept
& && && && && && && &&&127 0 0 0 0 0 0
& && && && && && && &&&144 0 2 0 0 0 0
& && && && && && && &&&191 0 0 0 0 0 0
& && && && && && && &&&194 0 0 0 0 0 0
& && && && && && && && &211 0 0 0 0 0 0
6、对Term-document矩阵的进一步操作举例
& && && findFreqTerms(dtm, 5)& & //nd those terms that occur at least 5 times in these 20 files& & 显示如下:
& && && && && &[1] "15.8" "accord" "agency" "ali"
& && && && && &[5] "analysts" "arab" "arabia" "barrel."
& && && && && &[9] "barrels" "bpd" "commitment" "crude"
& && && && && &[13] "daily" "dlrs" "economic" "emergency"
& && && && && &[17] "energy" "exchange" "exports" "feb"
& && && && && &[21] "futures" "government" "gulf" "help"
& && && && && &[25] "hold" "international" "january" "kuwait"
& && && && && &[29] "march" "market"
& && && findAssocs(dtm, "opec", 0.8)& && && && &// Find associations (i.e., terms which correlate) with at least 0:8 correlation for the term opec
& && && && & opec& && && & prices.& && && && & 15.8
& && && && &&&1.00& && && & 0.81& && && && && && &0.80
& &&&如果需要考察多个文档中特有词汇的出现频率,可以手工生成字典,并将它作为生成矩阵的参数
& &&&& d &- Dictionary(c("prices", "crude", "oil")))
& &&&& inspect(DocumentTermMatrix(reuters, list(dictionary = d)))
& && &因为生成的term-document矩阵dtm是一个稀疏矩阵,再进行降维处理,之后转为标准数据框格式
& && && dtm2 &- removeSparseTerms(dtm, sparse=0.95)&&& && &&&//parse值越少,最后保留的term数量就越少
& && && data &- as.data.frame(inspect(dtm2))& && && && && && && && && && & //最后将term-document矩阵生成数据框就可以进行聚类等操作了见下部分
7、 再之后就可以利用R语言中任何工具加以研究了,下面用层次聚类试试看
& && & & data.scale &- scale(data)
& && & & d &- dist(data.scale, method = "euclidean")
& && & & fit &- hclust(d, method="ward")
& &&&&&&plot(fit) & &//图形见下
刚表态过的朋友 ()
不用这样吧。
楼主也没说是自己原创的,只是没有转载链接。Tiny语言编译器之TM虚拟机接口
TM虚拟机接口用于生成TM指令,源代码如下:
#ifndef&_CODE_H_
#define&_CODE_H_
#define&pc&7&//程序寄存器
#define&mp&6&//指向数据区顶部
#define&gp&5&//指向数据区底部
#define&ac&0
#define&ac1&0
//输出寄存器指令
void&emitRO(char&*op,&int&r,&int&s,&int&t,&char*&c);
//输出寄存器内存指令
void&emitRM(char&*op,&int&r,&int&d,&int&s,&char&*c);
//跳过一些指令标号,返回当前指令标号
int&emitSkip(int&howmany);
//回到loc处产生指令
void&emitBackup(int&loc);
//恢复当前位置
void&emitRestore();
//将绝对地址指令转化为相对地址指令
void&emitRM_Abs(char&*op,&int&r,&int&a,&char*&c);
//输出注释
void&emitComment(char*&c);
#endif #include&"globals.h"
#include&"code.h"
static&int&emitLoc&=&0&;&//当前标号,用于产生当前指令
static&int&highEmitLoc&=&0;&//下一条指令的标号,在调用emitBackup后可以用highEmitLoc恢复当前标号
void&emitComment(&char&*&c&)
{&if&(TraceCode)&fprintf(code,"*&%s\n",c);}
void&emitRO(&char&*op,&int&r,&int&s,&int&t,&char&*c)
{&fprintf(code,"%3d:&&%5s&&%d,%d,%d&",emitLoc++,op,r,s,t);
&&if&(TraceCode)&fprintf(code,"\t%s",c)&;
&&fprintf(code,"\n")&;
&&if&(highEmitLoc&&&emitLoc)&highEmitLoc&=&emitLoc&;
void&emitRM(&char&*&op,&int&r,&int&d,&int&s,&char&*c)
{&fprintf(code,"%3d:&&%5s&&%d,%d(%d)&",emitLoc++,op,r,d,s);
&&if&(TraceCode)&fprintf(code,"\t%s",c)&;
&&fprintf(code,"\n")&;
&&if&(highEmitLoc&&&emitLoc)&&highEmitLoc&=&emitLoc&;
int&emitSkip(&int&howMany)
{&&int&i&=&emitL
&&&emitLoc&+=&howMany&;
&&&if&(highEmitLoc&&&emitLoc)&&highEmitLoc&=&emitLoc&;
&&&return&i;
void&emitBackup(&int&loc)
{&if&(loc&&&highEmitLoc)&emitComment("BUG&in&emitBackup");
&&emitLoc&=&loc&;
void&emitRestore(void)
{&emitLoc&=&highEmitL}
void&emitRM_Abs(&char&*op,&int&r,&int&a,&char&*&c)
{&fprintf(code,"%3d:&&%5s&&%d,%d(%d)&",
&&&&&&&&&&&&&&&emitLoc,op,r,a-(emitLoc+1),pc);
&&++emitLoc&;
&&if&(TraceCode)&fprintf(code,"\t%s",c)&;
&&fprintf(code,"\n")&;
&&if&(highEmitLoc&&&emitLoc)&highEmitLoc&=&emitLoc&;
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

我要回帖

更多关于 易语言屏蔽任务管理器 的文章

 

随机推荐