编译原理(一)之词法分析

词法分析

(1)参考附录1设计一个简单语言的词法分析程序,要求能够处理注释、换行回车、部分复合运算符(如>=)。

(2)设计并实现含多条简单赋值语句的语法分析程序,要求有一定的出错提示与错误恢复功能。    (参考附录2)

附录1:

例C源程序段:
main() 
{int  A,B,C,D;  /*类型说明*/ A=2; B=4; C=10; D=100;while (A<C  and B<D){  if (A==1) C=C-1;else    while (A<D){A=A+2;}   }
}

 

附录2:

a=2; b=4; 
c=c-1;
area=3.14*a*a;
s= 2*3.1416*r*(h+r);

实验代码

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;namespace WordPicker {/// <summary>/// 词/// </summary>struct Word {public int typeNum;public string word;public override string ToString() {return "(" + typeNum + "," + word + ")";}public string ToShow() {return typeNum + "," + word;}}class WordPicker {string input = "";int input_index = 0;char character;/// <summary>/// 关键字表/// </summary>string[] keyWordTable = {"auto","break","case", "char","const","continue","default","do","double","else","enum","extern","float","for","goto","if", "int","long", "register","return","short","signed","sizeof","static","struct","switch","typedef","union","unsigned","void","volatile","while"};/// <summary>/// 操作符表/// </summary>string[] operatorTable = {"{","}","(",")","[","]","->",".","++","--","&&","||","!","~","&","|","^","+","-","*","%","/","<<",">>","<",">",">=","<=","==","!=","?",":",",",";","=","+=","-=","*=","/=","%=","&=","^=","|=",">>=","<<="};string[] operatorSort = null;int wordTypeNumber;    //变量名类型int numberTypeNumber;  //数值类型int charTypeNumber;    //字符类型int stringTypeNumber;    //字符串类型int endTypeNumber = -1;  //结束符类型int errorTypeNumber = -1;  //出错类型int noDefine = -3;      //未定义类型// char endChar = '#';char nullChar = '\0';public WordPicker() {wordTypeNumber = keyWordTable.Length;numberTypeNumber = keyWordTable.Length + 1;charTypeNumber = keyWordTable.Length + 2;stringTypeNumber = keyWordTable.Length + 3;operatorSort = new string[operatorTable.Length];Array.Copy(operatorTable, operatorSort, operatorTable.Length);Array.Sort(operatorSort);Array.Reverse(operatorSort);}static void Main(string[] args) {WordPicker p = new WordPicker();int over = 1;string file = "text.txt";p.input = File.ReadAllText(file);StreamWriter sw =new StreamWriter("result.txt");while(over > p.errorTypeNumber ) {Word w = p.scanner();if(w.typeNum < p.errorTypeNumber) {Console.WriteLine(w);sw.WriteLine(w.ToShow());}over = w.typeNum;}sw.Flush();sw.Close();Console.ReadKey();}/// <summary>/// 读词/// </summary>/// <returns></returns>Word scanner() {Word myWord;myWord.typeNum = -1;myWord.word = "";read();readValidChar();//标识符if(char.IsLetter(character)) {readWord(ref myWord);}//数值else if(char.IsDigit(character)) {readDigit(ref myWord);}//字符常量else if(character == '\'') {readConstChar(ref myWord);}//字符串else if(character == '\"') {readConstString(ref myWord);}/*//结束符else if(character == endChar) {myWord.word = "" + endChar;myWord.typeNum = endTypeNumber;}*///空值else if(character == nullChar) {myWord.word = "null";myWord.typeNum = errorTypeNumber;}//其他字符else {readOtherChar(ref myWord);}return myWord;}/// <summary>/// 标识符/// </summary>/// <param name="myWord"></param>private void readWord(ref Word myWord) {while(char.IsLetter(character) || char.IsDigit(character)) {myWord.word += character;read();}retract();myWord.typeNum = getKeyTypeNumber(myWord.word);}/// <summary>/// 其他字符/// </summary>/// <param name="myWord"></param>private void readOtherChar(ref Word myWord) {string s = "" + character;for(int i = 0; i < 2; i++) {read();if(character == nullChar) {break;}s += character;}foreach(string op in operatorSort) {if(s.StartsWith(op)) {input_index -= s.Length - op.Length;s = op;break;}}myWord.word = s;myWord.typeNum = getOperatorTypeNumber(myWord.word);}/// <summary>/// 识别数字常量/// </summary>/// <param name="myWord"></param>private void readDigit(ref Word myWord) {while(char.IsDigit(character)) {myWord.word += character;read();}if(character == '.') {myWord.word += character;read();while(char.IsDigit(character)) {myWord.word += character;read();}}retract();myWord.typeNum = numberTypeNumber;// return myWord;}/// <summary>/// 识别字符常量/// </summary>/// <param name="myWord"></param>private void readConstChar(ref Word myWord) {// myWord.word = "" + character;read();//读取直到'\''结束while(character != '\'') {myWord.word += character;read();//读到空字符或结束字符if(character == nullChar /*|| character == endChar*/|| char.IsControl(character)) {/* if(character == endChar) {myWord.word +=endChar;} */                                   myWord.typeNum = errorTypeNumber;return;}}// myWord.word += character;Match r = Regex.Match(myWord.word, "^(\\\\([0-7]{1,3}|x[0-9a-fA-F]+|[abfnrtv\\\\\'\"?])|[^\\\\])$");//转义字符模式匹配if(!r.Success) {myWord.typeNum = errorTypeNumber;return;}myWord.typeNum = charTypeNumber;}/// <summary>/// 识别常量字符串/// </summary>/// <param name="myWord"></param>private void readConstString(ref Word myWord) {// myWord.word = "" + character;read();while(character != '\"') {myWord.word += character;read();//读到空字符或结束字符if(character == nullChar|| char.IsControl(character)) {// myWord.word += "0";myWord.typeNum = errorTypeNumber;return;}}// myWord.word += character;//转义字符模式匹配if(!isLegalString(myWord.word)) {myWord.typeNum = errorTypeNumber;return;}myWord.typeNum = stringTypeNumber;}/// <summary>/// 合法字符串书写/// </summary>/// <param name="word"></param>/// <returns></returns>private bool isLegalString(string word) {int i = 0;while(i < word.Length) {if(word[i] == '\\') {if(++i == word.Length)return false;foreach(char c in translateChar) {if(c == word[i]) {goto aLabel;}}return false;}aLabel:i++;}return true;}const string translateChar = "abfnrtv\\\'\"?";const string realChar = "\a\b\f\n\r\t\v\\\'\"?";/// <summary>/// 转换为真实字符串/// </summary>/// <param name="word"></param>/// <returns></returns>private string toRealString(string word) {string res = "";int index;for(int i = 0; i < word.Length; i++) {if(word[i] == '\\') {if(++i == word.Length)throw new Exception("字符串以\\结尾异常");index = translateChar.IndexOf(word[i]);if(index == -1)throw new Exception("\\"+ word[i] + "解析异常");res += realChar[index];                   }else {res += word[i];}}return res;}/// <summary>/// 读一个字符/// </summary>void read() {if(input.Length <= input_index) {character = '\0';}elsecharacter = input[input_index++];}/// <summary>/// 去除无效字符/// </summary>void readValidChar() {while(char.IsWhiteSpace(character)) {if(input.Length <= input_index) {character = '\0';return;}character = input[input_index++];}//判断注释if(character == '/'&& input.Length > input_index+1) {ignoreNote();}}private void ignoreNote() {//注释‘//’if(input[input_index] == '/') {input_index++;do {if(input.Length <= input_index) {character = '\0';return;}character = input[input_index++];} while('\n' != character);read();readValidChar();}//注释‘/*。。。*/’else if(input[input_index] == '*') {input_index++;while(true) {if(input.Length <= input_index) {character = '\0';return;}character = input[input_index++];if('*' == character && input.Length >= input_index + 1 && '/' == input[input_index]) {input_index++;read();readValidChar();return;}}}}/// <summary>/// 获取关键字编码/// </summary>/// <returns></returns>int getKeyTypeNumber(string s) {for(int i = 0; i < keyWordTable.Length; i++) {if(keyWordTable[i] == s) {return i;}}return keyWordTable.Length;}int getOperatorTypeNumber(string s) {int start = 100;for(int i = 0; i < operatorTable.Length; i++) {if(operatorTable[i] == s) {return start + i;}}return noDefine;}void retract() {input_index--;}}
}

输入文件:

int main(){	// int x=9; //int a=c;            // if (x>0.123)  ///* foolish abc  */x=2*x+1/3;// int c=0;
//int b=10;	/*while(b!=0){b--;
}*//* do{int /*fdfd* / a=2.1;}while(!1);*/int ab;int a>>=ab;a=ab+-a;return 0;
}//
# 

输出: 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/323800.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

粗略使用.NetCore2.0自带授权登陆Authorize

上篇Linux.NetCoreNginx搭建集群 有朋友提及到如果nginx做集群后应该还会有下一篇文章主讲session控制&#xff0c;一般来说就是登陆&#xff1b;本篇分享的内容不是关于分布式session内容&#xff0c;而是netcore自带的授权Authorize&#xff0c;Authorize粗略的用法&#xff…

vue中如何在地图中标点…

“大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;雄雄的小课堂。”前言昨天分享了下vue中v-for的一些特殊用法&#xff0c;料想标题给写成了vi-for…太粗心了。文章连接在这里&#xff1a;vue中如何使用v-for限制遍历的条数&#xff1f;只查询前三条、…

被黑客盯上了…数据都给打包带走了…

“大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;雄雄的小课堂。”前言在创建数据库的时候&#xff0c;突然之间&#xff0c;发现创建的表通过select * from 表名 查询不到了&#xff0c;于是就开始检查是不是sql语句写错了&#xff0c;检查半天&#…

编译原理(二)之语法分析

采用实验1的简单语言&#xff0c;设计并实现含多条简单赋值语句的语法分析程序&#xff0c;要求采用算符优先的分析算法。 注意与实验1、2的衔接。 using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using Syste…

ASP.Net Core Razor 页面路由

在服务器端 Web 应用程序框架中&#xff0c;其中非常重要的设计是开发人员如何将URL与服务器上的资源进行匹配&#xff0c;以便正确的处理请求。最简单的方法是将 URL 映射到磁盘上的物理文件&#xff0c;在 Razor 页面框架中&#xff0c;ASP.NET团队就是这样实现的。 关于 Ra…

vue实现下拉列表远程搜索示例(根据关键词模糊搜索)

“大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;雄雄的小课堂”前言昨天的链接没有放上去……大家访问新站的时候&#xff0c;可以在浏览器地址栏中输入&#xff1a;www.穆雄雄.com或者www.muxiongxiong.cn都可以。今天分享的效果如下&#xff1a;ima…

编译原理(三)之语义分析

采用实验1的简单语言&#xff0c;设计并实现含多条简单赋值语句的语法语义分析程序&#xff0c;要求采用递归下降翻译法。 注意与实验1、2的衔接。 using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.T…

活动: 北京Xamarin分享会第6期(2017年9月9日)

每月第二个周六&#xff0c;北京丹棱街5号微软大厦&#xff0c;有什么活动&#xff1f;对, BXUG线下分享活动又来啦! 本次分享嘉宾阵容庞大&#xff0c;在金秋凉爽的季节&#xff0c;期待与大家面对面的交流。内容预告&#xff1a; 案例分享&#xff1a;某大型国企IT项目如何采…

捡到东西说给钱才给东西?算不算敲诈勒索……

“大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;雄雄的小课堂”前言前两天&#xff0c;将一个那天急要但是后来就不重要的东西&#xff0c;放在车筐里面&#xff0c;结果到目的地一看&#xff0c;没了……椅子还没坐热&#xff0c;有人打来电话了“你…

编译原理(四)之解析语言翻译成三地址代码

选择部分C语言的语法成分&#xff0c;设计其词法语法语义分析程序。 设计并实现一个一遍扫描的词法语法语义分析程序&#xff0c;将部分C语言的语法成分翻译成三地址代码&#xff0c;要求有一定的出错提示和错误恢复功能。 例如简单赋值语句&#xff1a; area3.14*a*a; s 2*…

[北京微软技术直通车]前端 Visual Studio Code 开发 Angular 与亿级 SQL Servern

微软技术直通车第一期将于2017年9月9日与大家见面&#xff0c;本次邀请华北区微软技术专家和大家一起交流前端工具与技术&#xff0c; Visual Studio Code&#xff0c;TypeScript 与 Anuglar 项目开发和亿级数据库运维的最佳实践&#xff0c;分享相关技术的发展前景和从业经验&…

vue中如何实现全全全屏和退出全屏?

“大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;雄雄的小课堂”最近总有人给我说ta有社恐&#xff0c;明明是有社牛好不好……前言在做大屏界面的时候&#xff0c;客户有个要求&#xff0c;一进去登录成功之后&#xff0c;要有全屏的功能&#xff0c;…

【深圳】掌通宝科技有限公司技术总监(兼架构师),约吗

技术总监&#xff08;兼架构师&#xff09; 岗位职责&#xff1a; 1、主持研发中心日常管理工作&#xff0c;负责公司O2O平台,SaaS平台管理&#xff1b; 2、负责公司.net后台&#xff0c;Android客户端、IOS客户端、WEB平台等架构设计&#xff1b; 4、解决开发中的技术问题…

树层级处理上万条数据优化!

“大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;雄雄的小课堂。”前言项目中&#xff0c;部门数超万&#xff0c;导致页面加载价卡顿怎么办&#xff1f;使用若依自带解析树的方法在本地运行没有任何问题&#xff0c;但是一发布到服务器上就显示加载超…

Orleans解决并发之痛(三):集群

Orleans本身的设计是一个分布式的框架&#xff0c;多个Silo构成集群&#xff0c;Grains分布在多个Silo中。一旦一个Silo挂了&#xff0c;原来归属这个Silo的Grains会自动在其他Silo中激活。生产环境下还是需要以集群方式来部署。 cluster 在Orleans解决并发之痛&#xff08;二…

avue中实现消息的实时展示

“大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;雄雄的小课堂。”前言一个功能写了大半天&#xff0c;主要是数据表设计的有点复杂&#xff0c;且这个项目是10月份就写的放那的&#xff0c;里面有些东西都忘记了……先看数据库结构&#xff0c;然后理…

发达国家与发展中国家编程语言技术的分布差异性

近日&#xff0c;Stack Overflow在官方博客上发布了一组统计数据&#xff0c;表明发达国家与发展中国家在编程语言技术的采用上存在较大的差异。Stack Overflow对2017年1月至8月期间的访问数据进行了分析&#xff0c;选取了64个技术标签&#xff0c;每个标签所包含问题的访问次…

两个map中的数据,按照相同键,将所对应的值相加方法

“大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;雄雄的小课堂”前言最近写代码的时候遇到了个需求&#xff0c;刚开始想的时候&#xff0c;感觉不难&#xff0c;挺简单的&#xff0c;结果写的时候&#xff0c;各种思考、各种费脑&#xff0c;耗费了点…

publiccms中将推荐页的内容显示在页面片段中

遍历的代码如下&#xff1a; <#list page.list><ul><#items as a><li><figure><!-- ${a.itemType!} : ${a.itemId!} ,place/redirect:count and 301 jump to a.url,place/click:count and 302 jump to a.url--><a href"${site.dyn…

ASP.NET Core 运行原理解剖[3]:Middleware-请求管道的构成

在 ASP.NET 中&#xff0c;我们知道&#xff0c;它有一个面向切面的请求管道&#xff0c;有19个主要的事件构成&#xff0c;能够让我们进行灵活的扩展。通常是在 web.config 中通过注册 HttpModule 来实现对请求管道事件监听&#xff0c;并通过 HttpHandler 进入到我们的应用程…