c语言词法分析:C#源码

简介:

今天继续研究代码解析的算法
这个是算法流程图

有图解可能更直观一点;
以下是c#源码:

1 using System;
2 using System.IO;
3 using System.Text;
4 using System.Windows.Forms;
5 using System.Collections;
6
7 namespace CodeFormatter {
8/**//// <summary>
9/// CodeFormatterFactory 的摘要说明。
10/// c 代码解析,不支持中文
11/// </summary>

12public class CodeFormatterFactory {
13/**//*源代码*/
14private string sourceCode = "";
15
16/**//*C语言所有关键字,共32个*/
17 ArrayList KeyWordList = new ArrayList();
18
19/**//*运算、限界符*/
20 ArrayList LimitList = new ArrayList();
21
22/**//*常量表*/
23 ArrayList ConstList = new ArrayList();
24
25/**//*标识符*/
26 ArrayList IdentifierList = new ArrayList();
27
28/**//*输出*/
29 ArrayList OutputList = new ArrayList();
30
31public CodeFormatterFactory() {
32//
33// TODO: 在此处添加构造函数逻辑
34//
35 init();
36 }

37
38public string SourceCode{
39get{return this.sourceCode;}
40set{this.sourceCode =value;}
41 }

42
43public string ParseMessages{
44get{
45string pm = "";
46
47 IEnumerator ie = this.OutputList.GetEnumerator();
48while ( ie.MoveNext() )
49 pm += ie.Current.ToString() + "\r\n";
50return pm;
51 }

52 }

53
54private void init() {
55/**//*C语言所有关键字,共32个*/
56string[] key=new string[]{" ","auto","break","case","char","const","continue","default","do","double",
57 "else","enum","extern","float","for","goto","if","int","long","register",
58 "return","short","signed","sizeof","static","struct","switch","typedef",
59 "union","unsigned","void","volatile","while"}
;
60/**//*运算、限界符*/
61string[] limit=new string[]{" ","(",")","[","]","->",".","!","++","--","&","~",
62 "*","/","%","+","-","<<",">>","<","<=",">",">=","==","!=","&&","||",
63 "=","+=","-=","*=","/=",",",";","{","}","#","_","'"}
;
64
65this.KeyWordList.Clear();
66this.KeyWordList.TrimToSize();
67for(int i=1;i<key.Length;i++)
68this.KeyWordList.Add(key[i]);
69
70this.LimitList.Clear();
71this.LimitList.TrimToSize();
72for(int i=1;i<limit.Length;i++)
73this.LimitList.Add(limit[i]);
74
75this.ConstList.Clear();
76this.ConstList.TrimToSize();
77
78this.IdentifierList.Clear();
79this.IdentifierList.TrimToSize();
80
81this.OutputList.Clear();
82this.OutputList.TrimToSize();
83 }

84
85/**//*******************************************
86 * 十进制转二进制函数
87 *******************************************/

88private string dtb(string buf){
89int[] temp= new int[20];
90string binary = "";
91int val=0,i=0;
92
93/**//*先将字符转化为十进制数*/
94try{
95 val = Convert.ToInt32(buf);
96 }
catch{
97 val = 0;
98 }

99
100if(val==0) {
101return(val.ToString());
102 }

103
104 i=0;
105while(val!=0) {
106 temp[i++]=val%2;
107 val/=2;
108 }

109
110 binary = "";
111for(int j=0;j<=i-1;j++)
112 binary += (char)(temp[i-j-1]+48);
113
114return(binary);
115 }

116
117/**//*******************************************
118 * 根据不同命令查表或造表函数
119 *******************************************/

120private int find(string buf,int type,int command){
121int number=0;
122string temp;
123
124 IEnumerator ie = null;
125 ArrayList al = null;
126switch(type){
127case 1://关键字表
128 ie = this.KeyWordList.GetEnumerator();
129break;
130case 2://标识符表
131 ie = this.IdentifierList.GetEnumerator();
132break;
133case 3://常数表
134 ie = this.ConstList.GetEnumerator();
135break;
136case 4://运算、限界符表
137 ie = this.LimitList.GetEnumerator();
138break;
139 }

140
141if(ie!=null)
142while (ie.MoveNext()){
143 temp = ie.Current.ToString();
144if(temp.Trim().ToLower()==buf.Trim().ToLower()){
145return number;
146 }

147 number ++;
148 }

149
150if(command==1){
151/**//*找不到,当只需查表,返回0,否则还需造表*/
152return 0;
153 }

154
155switch(type){
156case 1: al = this.KeyWordList;break;
157case 2: al = this.IdentifierList;break;
158case 3: al = this.ConstList;break;
159case 4: al = this.LimitList;break;
160 }

161if(al!=null)
162 al.Add(buf);
163
164return number + 1;
165 }

166/**//*******************************************
167 * 数字串处理函数
168 *******************************************/

169private void cs_manage(string buffer){
170string binary = dtb(buffer);
171int result = find(binary,3,2);
172this.OutputList.Add(String.Format("{0}\t\t\t3\t\t\t{1}",buffer,result));
173 }

174
175/**//*******************************************
176 * 字符串处理函数
177 *******************************************/

178private void ch_manage(string buffer) {
179int result = find(buffer,1,1);
180if(result!=0){
181this.OutputList.Add(String.Format("{0}\t\t\t1\t\t\t{1}",buffer,result));
182 }
else{
183 result = find(buffer,2,2);
184this.OutputList.Add(String.Format("{0}\t\t\t2\t\t\t{1}",buffer,result));
185 }

186 }

187
188/**//*******************************************
189 * 出错处理函数
190 *******************************************/

191private void er_manage(char error,int lineno) {
192this.OutputList.Add(String.Format("错误关键字: {0} ,所在行: {1}",error,lineno));
193 }

194
195/**//*******************************************
196 * 转换Char数组为string
197 ******************************************/

198private string joinString(char[] array,int Length){
199string s = "";
200if(array.Length>0)
201for(int i=0;i<Length;i++){
202if(array[i]!='\0') {
203 s+=array[i];
204 }
else{
205break;
206 }

207 }

208return s;
209 }

210
211private char getchc(ref int n){
212char[] c = sourceCode.ToCharArray();
213if(n<c.Length){
214char r = c[n];
215 n++;
216return r;
217 }

218return sourceCode[sourceCode.Length-1];
219 }

220/**//*******************************************
221 * 扫描程序
222 ********************************************/

223public void Parse() {
224//StreamWriter fpout = null;
225 char ch ;
226int i=0,line=1;
227int count,result,errorno=0;
228char[] array = new char[30];
229string word= "";
230
231/**//*按字符依次扫描源程序,直至结束*/
232int n = 0;
233
234while(n<sourceCode.Length-1){
235 i = 0;
236 ch = getchc(ref n);
237/**//*以字母开头*/
238if(((ch>='A')&&(ch<='Z'))||((ch>='a')&&(ch<='z'))||(ch=='_')) {
239while(((ch>='A')&&(ch<='Z'))||((ch>='a')&&(ch<='z'))||(ch=='_')||((ch>='0')&&(ch<='9'))) {
240 array[i++]=ch;
241 ch = getchc(ref n);
242 }

243 array[i++] = '\0';
244 word = joinString(array,array.Length);
245 ch_manage(word);
246if(n<sourceCode.Length)n--;
247 }
else if(ch>='0'&&ch<='9') {
248/**//*以数字开头*/
249while(ch>='0'&&ch<='9') {
250 array[i++]=ch;
251 ch = getchc(ref n);
252 }

253 array[i++] = '\0';
254 word=joinString(array,array.Length);
255 cs_manage(word);
256if(n<sourceCode.Length)n--;
257 }

258else if((ch==' ')||(ch=='\t'))
259/**//*消除空格符和水平制表符*/
260 ;
261else if(ch=='\n')
262/**//*消除回车并记录行数*/
263 line++;
264else if(ch=='/') {
265/**//*消除注释*/
266 ch = getchc(ref n);
267if(ch=='=') {
268/**//*判断是否为‘/=’符号*/
269this.OutputList.Add(String.Format("/=\t\t\t4\t\t\t32"));
270 }

271else if(ch!='*') {
272/**//*若为除号,写入输出*/
273this.OutputList.Add(String.Format("/\t\t\t4\t\t\t13"));
274 n--;
275 }
else if(ch=='*') {
276/**//*若为注释的开始,消除包含在里面的所有字符*/
277 count=0;
278 ch = getchc(ref n);
279while(count!=2) {
280/**//*当扫描到‘*’且紧接着下一个字符为‘/’才是注释的结束*/
281 count=0;
282while(ch!='*')
283 ch = getchc(ref n);
284 count++;
285 ch = getchc(ref n);
286if(ch=='/')
287 count++;
288else
289 ch = getchc(ref n);
290 }

291 }

292 }

293else if(ch=='"') {
294/**//*消除包含在双引号中的字符串常量*/
295this.OutputList.Add(String.Format("{0}\t\t\t4\t\t\t37",ch));
296while(ch!='"')
297 ch = getchc(ref n);
298this.OutputList.Add(String.Format("{0}\t\t\t4\t\t\t37",ch));
299 }

300else {
301/**//*首字符为其它字符,即运算限界符或非法字符*/
302 array[0]=ch;
303/**//*再读入下一个字符,判断是否为双字符运算、限界符*/
304 ch = getchc(ref n);
305/**//*若该字符非结束符*/
306if(n<sourceCode.Length) {
307 array[1]=ch;
308 array[2] = '\0';
309 word = joinString(array,2);
310 result=find(word,4,1); /**//*先检索是否为双字符运算、限界符*/
311if(result==0) {
312/**//*若不是*/
313 array[2] = '\0';
314 word = joinString(array,1);
315 result=find(word,4,1);
316/**//*检索是否为单字符运算、限界符*/
317if(result==0) {
318/**//*若还不是,则为非法字符*/
319 er_manage(array[0],line);
320 errorno++;
321 n--;
322 }

323else {
324/**//*若为单字符运算、限界符,写入输出并将扫描指针回退一个字符*/
325this.OutputList.Add(String.Format("{0}\t\t\t4\t\t\t{1}\t",word,result));
326 n--;
327 }

328 }

329else {
330/**//*若为双字符运算、限界符,写输出*/
331this.OutputList.Add(String.Format("{0}\t\t\t4\t\t\t{1}",word,result));
332 }

333 }

334else {
335/**//*若读入的下一个字符为结束符*/
336 array[2] = '\0';
337 word = joinString(array,1);
338/**//*只考虑是否为单字符运算、限界符*/
339 result=find(word,4,1);
340/**//*若不是,转出错处理*/
341if(result==0)
342 er_manage(array[0],line);
343else {
344/**//*若是,写输出*/
345this.OutputList.Add(String.Format("{0}\t\t\t4\t\t\t{1}",word,result));
346 }

347 }

348 }

349 ch = getchc(ref n);
350 }

351/**//*报告错误字符个数*/
352this.OutputList.Add(String.Format("\n共有 {0} 个错误.\n",errorno));
353 }

354
355 }

356}




本文转自suifei博客园博客,原文链接:http://www.cnblogs.com/Chinasf/archive/2005/04/22/143449.html,如需转载请自行联系原作者
相关文章
|
11天前
|
开发框架 前端开发 JavaScript
C# 6.0+JavaScript云LIS系统源码  云LIS实验室信息管理新型解决方案
云LIS是为区域医疗提供临床实验室信息服务的计算机应用程序,可协助区域内所有临床实验室相互协调并完成日常检验工作,对区域内的检验数据进行集中管理和共享,通过对质量控制的管理,最终实现区域内检验结果互认。其目标是以医疗服务机构为主体,以医疗资源和检验信息共享为目标,集成共性技术及医疗服务关键技术,建立区域协同检验,最大化利用有限的医疗卫生资源。
105 1
|
11天前
|
存储 SQL 网络协议
C语言C/S架构PACS影像归档和通信系统源码 医院PACS系统源码
医院影像科PACS系统,意为影像归档和通信系统。它是应用在医院影像科室的系统,主要的任务是把日常产生的各种医学影像(包括核磁、CT、超声、各种X光机、各种红外仪、显微仪等设备产生的图像)通过各种接口(模拟、DICOM、网络)以数字化的方式海量保存起来,并在需要的时候在一定授权下能够快速地调回使用。同时,PACS系统还增加了一些辅助诊断管理功能。
42 11
|
11天前
|
数据采集 安全 JavaScript
C#医院手术麻醉信息管理系统源码 对接院内HIS、LIS、PACS
手麻系统的功能涵盖了麻醉临床业务管理、麻醉运营业务管理以及手术进程管理等,实现了将多种麻醉病历文书与医院HIS系统的有效关联,让手术室人员、设备资源和信息资源高度共享;实现了手术安排、各种统计报表等科室管理和科研工作的需求,可借其收集临床数据、进行整合分析,为围术期临床信息、管理、科研提供整体解决方案;该系统的运行,为医护人员提供了流程化、信息化、自动化、智能化的临床业务综合管理。
36 5
|
11天前
|
前端开发 Java C#
java/C#语言开发的医疗信息系统11套源码
java/C#语言开发的医疗信息系统11套源码
29 1
|
11天前
|
安全 测试技术 C#
C#.手术麻醉系统源码 手麻系统如何与医院信息系统进行集成?
C#手术麻醉系统源码集成到医院信息系统涉及标准数据接口、患者信息同步、医嘱报告共享、实时监测数据传输及安全权限管理。通过这些步骤,确保信息的准确、及时和安全流动,提升医疗效率和服务质量。系统集成后需测试优化,以保证稳定性。图片展示了集成的不同方面。
19 0
|
11天前
|
XML 安全 JavaScript
B/S基于C#手术麻醉信息系统源码 手麻系统源码 有演示
手术室麻醉临床信息系统是应用于医院手术室、麻醉科室的计算机软件系统。该系统针对整个围术期,对病人进行全程跟踪与信息管理,自动集成病人HIS、LIS、RIS、PACS信息,采集监护等设备数据,根据质控要求自动生成电子单据, 系统提供智能手术排班、科室耗材管理、麻醉收费、主任管理、电子处方等业务功能,高度整合各科室应用需求,实现手术麻醉过程的无纸化和医疗流程的规范化,为手术室全面信息化提供了整体解决方案。
19 1
B/S基于C#手术麻醉信息系统源码 手麻系统源码 有演示
|
11天前
|
传感器 数据采集 大数据
C#/BS手麻系统源码 手术麻醉管理系统源码 商业项目源码
手麻系统从麻醉医生实际工作环境和流程需求方面设计,与HIS,LIS,PACS,EMR无缝连接,方便查看患者的信息;实现术前、术中、术后手术麻醉信息全记录;减少麻醉医师在手术中填写麻醉记录单时间,证手术麻醉相关信息的准确性,有效降低医护人员的术中书写医疗文书的压力,使得麻醉医生在术中能够更加集中精力在病人的麻醉操作上,提升手术质量
22 2
|
11天前
|
存储 运维 BI
基于C#-VC-MSSQL开发的全套PACS系统源码 3D PACS系统源码:可实现医学影像获取、存档、观片、处理、打印多项应用
PACS的功能价值在于通过连接不同的影像设备,存储与管理图像,图像的调用与后处理,实现资源共享,降低成本,达到提高工作效率、提升医疗水平的目地;
18 1
基于C#-VC-MSSQL开发的全套PACS系统源码  3D PACS系统源码:可实现医学影像获取、存档、观片、处理、打印多项应用
|
11天前
|
存储 数据采集 安全
C#医院手术室麻醉信息管理系统源码 自动生成麻醉的各种医疗文书(手术风险评估表、手术安全核查表)
医院手术麻醉信息系统有着完善的临床业务功能,能够涵盖整个围术期的工作,能够采集、汇总、存储、处理、展现所有的临床诊疗资料。通过该系统的实施,能够规范麻醉科的工作流程,实现麻醉手术过程的信息数字化,自动生成麻醉的各种医疗文书,完成共享HIS、LIS、PACS和EMR等手术患者信息,从而提高麻醉、手术工作的管理水平。
30 3
|
11天前
|
存储 开发框架 前端开发
C#开发的全套成熟的LIS系统源码JavaScript+SQLserver 2012区域云LIS系统源码
医院云LIS系统是一套成熟的实验室信息管理系统,目前已在多家三级级医院应用,并不断更新。云LIS系统是为病人为中心、以业务处理为基础、以提高检验科室管理水平和工作效率为目标,将医学检验、科室管理和财务统计等检验科室/实验室所有工作进行整合,全面改善检验科室/实验室的工作现状。
21 0