Form1.cs
上传用户:ab16833
上传日期:2013-05-29
资源大小:10k
文件大小:9k
源码类别:

词法分析

开发平台:

C#

  1. using System;
  2. using System.Drawing;
  3. using System.Collections;
  4. using System.ComponentModel;
  5. using System.Windows.Forms;
  6. using System.Data;
  7. using System.IO;
  8. namespace Construe
  9. {
  10. /// <summary>
  11. /// Form1 的摘要说明。
  12. /// </summary>
  13. public class Form1 : System.Windows.Forms.Form
  14. {
  15. private System.Windows.Forms.TextBox txtSource;
  16. private System.Windows.Forms.TextBox txtTarget;
  17. char[] a = new char[1000];  //将字符串转换成字符数组
  18. string[] kw = new string[6];  //保留字字符表
  19. private System.Windows.Forms.Button btnSinConstrue;
  20. private System.Windows.Forms.Button btnConConstrue;
  21. private System.Windows.Forms.Button button1;
  22. /// <summary>
  23. /// 必需的设计器变量。
  24. /// </summary>
  25. private System.ComponentModel.Container components = null;
  26. public Form1()
  27. {
  28. //
  29. // Windows 窗体设计器支持所必需的
  30. //
  31. InitializeComponent();
  32. //
  33. // TODO: 在 InitializeComponent 调用后添加任何构造函数代码
  34. //
  35. }
  36. /// <summary>
  37. /// 清理所有正在使用的资源。
  38. /// </summary>
  39. protected override void Dispose( bool disposing )
  40. {
  41. if( disposing )
  42. {
  43. if (components != null) 
  44. {
  45. components.Dispose();
  46. }
  47. }
  48. base.Dispose( disposing );
  49. }
  50. #region Windows 窗体设计器生成的代码
  51. /// <summary>
  52. /// 设计器支持所需的方法 - 不要使用代码编辑器修改
  53. /// 此方法的内容。
  54. /// </summary>
  55. private void InitializeComponent()
  56. {
  57. this.btnSinConstrue = new System.Windows.Forms.Button();
  58. this.txtSource = new System.Windows.Forms.TextBox();
  59. this.txtTarget = new System.Windows.Forms.TextBox();
  60. this.btnConConstrue = new System.Windows.Forms.Button();
  61. this.button1 = new System.Windows.Forms.Button();
  62. this.SuspendLayout();
  63. // 
  64. // btnSinConstrue
  65. // 
  66. this.btnSinConstrue.Location = new System.Drawing.Point(88, 256);
  67. this.btnSinConstrue.Name = "btnSinConstrue";
  68. this.btnSinConstrue.Size = new System.Drawing.Size(104, 32);
  69. this.btnSinConstrue.TabIndex = 1;
  70. this.btnSinConstrue.Text = "初步分析";
  71. this.btnSinConstrue.Click += new System.EventHandler(this.button1_Click);
  72. // 
  73. // txtSource
  74. // 
  75. this.txtSource.Location = new System.Drawing.Point(56, 56);
  76. this.txtSource.Multiline = true;
  77. this.txtSource.Name = "txtSource";
  78. this.txtSource.Size = new System.Drawing.Size(344, 184);
  79. this.txtSource.TabIndex = 3;
  80. this.txtSource.Text = "";
  81. // 
  82. // txtTarget
  83. // 
  84. this.txtTarget.Location = new System.Drawing.Point(64, 304);
  85. this.txtTarget.Multiline = true;
  86. this.txtTarget.Name = "txtTarget";
  87. this.txtTarget.Size = new System.Drawing.Size(344, 208);
  88. this.txtTarget.TabIndex = 4;
  89. this.txtTarget.Text = "";
  90. // 
  91. // btnConConstrue
  92. // 
  93. this.btnConConstrue.Location = new System.Drawing.Point(240, 256);
  94. this.btnConConstrue.Name = "btnConConstrue";
  95. this.btnConConstrue.Size = new System.Drawing.Size(104, 32);
  96. this.btnConConstrue.TabIndex = 5;
  97. this.btnConConstrue.Text = "高级分析";
  98. this.btnConConstrue.Click += new System.EventHandler(this.button2_Click);
  99. // 
  100. // button1
  101. // 
  102. this.button1.Location = new System.Drawing.Point(192, 8);
  103. this.button1.Name = "button1";
  104. this.button1.Size = new System.Drawing.Size(88, 32);
  105. this.button1.TabIndex = 6;
  106. this.button1.Text = "读取文件";
  107. this.button1.Click += new System.EventHandler(this.button1_Click_1);
  108. // 
  109. // Form1
  110. // 
  111. this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);
  112. this.ClientSize = new System.Drawing.Size(496, 534);
  113. this.Controls.Add(this.button1);
  114. this.Controls.Add(this.btnConConstrue);
  115. this.Controls.Add(this.txtTarget);
  116. this.Controls.Add(this.txtSource);
  117. this.Controls.Add(this.btnSinConstrue);
  118. this.Name = "Form1";
  119. this.Text = "Form1";
  120. this.ResumeLayout(false);
  121. }
  122. #endregion
  123. /// <summary>
  124. /// 应用程序的主入口点。
  125. /// </summary>
  126. [STAThread]
  127. static void Main() 
  128. {
  129. Application.Run(new Form1());
  130. }
  131. private void button1_Click(object sender, System.EventArgs e) //初级扫描时间
  132. {
  133. string strSource,strTarget;
  134. strSource = "";
  135. strSource = txtSource.Text;
  136. for (int i=0; i<strSource.Length; i++)                          //将字符串转换成字符数组
  137. a[i] = strSource[i];
  138. strTarget = "#";
  139. for (int i=0; i<a.Length; i++)     //对源字符串逐个扫描
  140. {
  141. if (a[i] == '{') //去除{}的注释部分
  142. {
  143. i++;
  144. while (a[i] != '}')
  145. i++;
  146. }
  147. if (Convert.ToInt32(a[i])>='A' && Convert.ToInt32(a[i])<='Z')          //读取保留字
  148. {
  149. strTarget += a[i];
  150. i++;
  151. while (Convert.ToInt32(a[i])>='A' && Convert.ToInt32(a[i])<='Z')
  152. {
  153. strTarget += a[i];
  154. i++;
  155. }
  156. i--;
  157. strTarget += '#';
  158. }
  159. if (Convert.ToInt32(a[i])>='a' && Convert.ToInt32(a[i])<='z') //读取标识符
  160. {
  161. strTarget += a[i];
  162. i++;
  163. while (Convert.ToInt32(a[i])>='a' && Convert.ToInt32(a[i])<='z')
  164. {
  165. strTarget += a[i];
  166. i++;
  167. }
  168. i--;
  169. strTarget += '#';
  170. }
  171. if (Convert.ToInt32(a[i])>='0' && Convert.ToInt32(a[i])<='9') //读取整数
  172. {
  173. strTarget += a[i];
  174. i++;
  175. while (Convert.ToInt32(a[i])>='0' && Convert.ToInt32(a[i])<='9')
  176. {
  177. strTarget += a[i];
  178. i++;
  179. }
  180. i--;
  181. strTarget += '#';
  182. }
  183. if (a[i]=='+' || a[i]=='-' || a[i]=='*' || a[i]==';' || a[i]=='.' || a[i]==','|| a[i]=='(' || a[i]==')')  //读取专用符号
  184. {
  185. strTarget += a[i];
  186. strTarget += '#';
  187. }
  188. if (a[i]==':')
  189. {
  190. strTarget += a[i];
  191. i++;
  192. if (a[i]=='=')
  193. {
  194. strTarget += a[i];
  195. }
  196. i--;
  197. strTarget += '#';
  198. }
  199. }
  200. txtTarget.Text = strTarget;
  201. }
  202. private void button2_Click(object sender, System.EventArgs e) //高级扫描事件
  203. {
  204. string strSou,strTar;
  205. kw[0] = "PROGRAM"; //保留字字符表
  206. kw[1] = "VAR";
  207. kw[2] = "BEGIN";
  208. kw[3] = "DIV";
  209. kw[4] = "END";
  210. kw[5] = "integer";
  211. string buffer; //将“单词”保存在buffer
  212. strSou = txtSource.Text;
  213. for (int i=0; i<strSou.Length; i++) //将字符串转换成字符数组
  214. a[i] = strSou[i];
  215. strTar = "";
  216. for (int i=0; i<a.Length; i++) //对源字符串逐个扫描
  217. {
  218. if (a[i] == '{') //去除{}的注释部分
  219. {
  220. i++;
  221. while (a[i] != '}')
  222. i++;
  223. }
  224. else if (a[i] == ' ' || a[i]=='n' || a[i]=='r') //去除空格、回车、换行符号
  225. {
  226. }
  227. else if (Convert.ToInt32(a[i])>='A' && Convert.ToInt32(a[i])<='Z') //读取保留字
  228. {
  229. buffer = ""; //将整个保留字读取在buffer
  230. buffer += a[i];
  231. i++;
  232. while (Convert.ToInt32(a[i])>='A' && Convert.ToInt32(a[i])<='Z')
  233. {
  234. buffer += a[i];
  235. i++;
  236. }
  237. i--;
  238. for (int j=0; j<5; j++) //判断保留字是否正确
  239. {
  240. if (String.Equals(kw[j],buffer))
  241. {
  242. strTar += "(1,'" + buffer + "')";
  243. break;
  244. }
  245. else if (j==4) //若保留字错误,输出错误信息
  246. {
  247. strTar += "rn'" + buffer + "' is error string" + "rn";
  248. }
  249. }
  250. }
  251. else if (Convert.ToInt32(a[i])>='a' && Convert.ToInt32(a[i])<='z') //读取标识符
  252. {
  253. buffer = "";
  254. buffer += a[i];
  255. i++;
  256. while (Convert.ToInt32(a[i])>='a' && Convert.ToInt32(a[i])<='z')
  257. {
  258. buffer += a[i];
  259. i++;
  260. }
  261. i--;
  262. if (buffer == kw[5]) //判断是不是保留字
  263. {
  264. strTar += "(1,'" + buffer + "')";
  265. }
  266. else
  267. {
  268. strTar += "(3,'" + buffer + "')";
  269. }
  270. }
  271. else if (Convert.ToInt32(a[i])>='0' && Convert.ToInt32(a[i])<='9') //读取整数
  272. {
  273. buffer = "";
  274. buffer += a[i];
  275. i++;
  276. while (Convert.ToInt32(a[i])>='0' && Convert.ToInt32(a[i])<='9')
  277. {
  278. buffer += a[i];
  279. i++;
  280. }
  281. i--;
  282. strTar += "(4,'" + buffer + "')";
  283. }
  284. else if (a[i]=='+' || a[i]=='-' || a[i]=='*' || a[i]==';' || a[i]=='=' || a[i]=='.' || a[i]==','|| a[i]=='(' || a[i]==')')   //读取专用符号
  285. {
  286. strTar += "(2,'" + a[i] + "')";
  287. }
  288. else if (a[i]==':')
  289. {
  290. buffer = "";
  291. buffer += a[i];
  292. i++;
  293. if (a[i]=='=')
  294. {
  295. buffer += a[i];
  296. }
  297. i--;
  298. strTar += "(2,'" + buffer + "')";
  299. }
  300. else //输出错误字符信息
  301. {
  302. strTar +=  "rn" + "'" + a[i] + "' is error string" + "rn";
  303. }
  304. }
  305. txtTarget.Text = strTar;
  306. }
  307. private void button1_Click_1(object sender, System.EventArgs e) //从文件中读取源程序
  308. {
  309. OpenFileDialog openFileDialog1 = new OpenFileDialog();;
  310. openFileDialog1.Filter = "txt files (*.txt)|*.txt" ;
  311. openFileDialog1.RestoreDirectory = true ;
  312. if (openFileDialog1.ShowDialog() == DialogResult.OK)
  313. {
  314. System.IO.StreamReader sr = new System.IO.StreamReader(openFileDialog1.FileName);
  315. txtSource.Text = sr.ReadToEnd(); //将文件内容读取到textbox
  316. sr.Close();
  317. }
  318. }
  319. }
  320. }