建立网站项目网络游戏排行榜2022
news/
2025/9/28 23:05:47/
文章来源:
建立网站项目,网络游戏排行榜2022,网站定制设计网页价格多少钱,电子商务平台内经营者享有公平交易的权利实现一个一遍扫描的编译前端#xff0c;将简化高级语言的部分语法成分#xff08;含赋值语句、分支语句、循环语句等#xff09;翻译成四元式#xff08;或三地址代码#xff09;#xff0c;还要求有合理的语法出错报错和错误恢复功能。
测试样例
beginwhile ab do…实现一个一遍扫描的编译前端将简化高级语言的部分语法成分含赋值语句、分支语句、循环语句等翻译成四元式或三地址代码还要求有合理的语法出错报错和错误恢复功能。
测试样例
beginwhile ab doif c5beginwhile xybeginz:x1;enda:2; b:4;c:c-1;area:3.14*a*a;s:2*3.1416*r*(hr);end
endend
#测试结果 词法分析程序 从文件中读取程序
(1, begin) (4, while) (10, a) (20, ) (10, b) (5, do) (2, if) (10, c) (20, ) (11, 5) (1, begin) (4, while) (10, x) (23, ) (10, y) (1, begin) (10, z) (18, :) (10, x) (13, ) (11, 1) (26, ; ) (6, end) (10, a) (18, :) (11, 2) (26, ; ) (10, b) (18, :) (11, 4) (26, ; ) (10, c) (18, :) (10, c) (14, -) (11, 1) (26, ; ) (10, area) (18, :) (11, 3.14) (15, *) (10, a) (15, *) (10, a) (26, ; ) (10, s) (18, :) (11, 2) (15, *) (11, 3.1416) (15, *) (10, r) (15, *) (27, () (10, h) (13, ) (10, r) (28, )) (26, ; ) (6, end) (6, end) (6, end) (0, #) 词法分析完成 语法分析中…,请稍候 error!--------缺少开头符号begin程序第4行出现语法错误 error!--------不是符号then程序第5行出现语法错误 error!--------不是符号do程序第7行出现语法错误 词法分析完成 语法分析完成共检查出3个语法错误
中间代码生成结果 0:if a b goto 2 1:goto 22 2:if c 5 goto 4 3:goto 21 4:if x y goto 6 5:goto 9 6:t1 x 1 7:z t1 8:goto 4 9:a 2 10:b 4 11:t2 c - 1 12:c t2 13:t3 3.14 * a 14:t4 t3 * a 15:area t4 16:t5 2 * 3.1416 17:t6 t5 * r 18:t7 h r 19:t8 t6 * t7 20:s t8 21:goto 0
语义分析
public class Element {String times;String data1;String op;String data2;String type;public void setInteger(Integer integer) {this.integer integer;}Integer integer;Element(String times,String data1,String op,String data2) {//this.times times;this.data1 data1;this.op op;this.data2 data2;}Element(String times,String data1,String op,String data2,Integer integer) {//if gotothis.times times;this.data1 data1;this.op op;this.data2 data2;this.integerinteger;}Element(Integer integer) {//if gotothis.integerinteger;}Element() {//if goto}
}public class SemanticAnalysis {static int j0,t1;static ListElement elements new ArrayListElement();static void memset(String times,String data1,String op,String data2) {Element e new Element(times,data1,op,data2);elements.add(e);}public static String expression() { // 表达式String times,data1,op,data2;data1 term();while(analyzer.llist.get(j).equals() || analyzer.llist.get(j).equals(-)) {// 当前单词为、if(analyzer.llist.get(j).equals()) // op ;else // -op -;j;data2 term();times t (t);memset(times,data1,op,data2);data1 times;}return data1;}private static String term() { // 项String times,data1,op,data2;data1 factor();while(analyzer.llist.get(j).equals(*) || analyzer.llist.get(j).equals(/) ) { // 当前单词为*、/if(analyzer.llist.get(j).equals(*)) // *op *;else // /op /;j;data2 factor();times t (t);memset(times,data1,op,data2);data1 times;}return data1;}private static String factor() { // 因子String data ;if(analyzer.map2.get(analyzer.llist.get(j)) 10) { // IDdata analyzer.llist.get(j);j;} else if(analyzer.map2.get(analyzer.llist.get(j)) 11) { // NUMdata analyzer.llist.get(j);j;}else if(analyzer.llist.get(j).equals(()) { // 左括号j;data expression();if(analyzer.llist.get(j).equals()))j;} else {System.out.println(Error,表达式错误);}return data;}}
语法分析 public class GrammarAnalysis {static char[] s new char[100];static int sing;static int i; //用来记录数组s中的下标static int error 0;static void P() {if (Objects.equals(analyzer.llist.get(i), begin)) {i;int cur analyzer.map.get(i);S();
//处理if (Objects.equals(analyzer.llist.get(i), end)) {i;} else {System.out.println(error!--------不是结尾符号end 程序第 analyzer.map.get(i) 行出现语法错误);error;i;}} else {System.out.println(error!--------缺少开头符号begin 程序第 analyzer.map.get(i) 行出现语法错误);error;S();
//处理if (Objects.equals(analyzer.llist.get(i), end)) {i;} else {System.out.println(error!--------不是结尾符号end 程序第 analyzer.map.get(i) 行出现语法错误);error;i;}}}static void B() {i;D();int cur SemanticAnalysis.elements.size();SemanticAnalysis.elements.add(new Element());//thenif (!analyzer.llist.get(i).equals(then)) {System.out.println(error!--------不是符号then 程序第 analyzer.map.get(i) 行出现语法错误);error;} elsei;P();SemanticAnalysis.elements.get(cur).setInteger(SemanticAnalysis.elements.size());//elsei--;}static void C() {i;D();int cur SemanticAnalysis.elements.size();SemanticAnalysis.elements.add(new Element());//doif (!analyzer.llist.get(i).equals(do)) {System.out.println(error!--------不是符号do 程序第 analyzer.map.get(i) 行出现语法错误);error;} elsei;P();SemanticAnalysis.elements.add(new Element(cur - 1));SemanticAnalysis.elements.get(cur).setInteger(SemanticAnalysis.elements.size());i--;}static void D() {String data1, data2, op;SemanticAnalysis.j i;;data1 SemanticAnalysis.expression();//表达式E();op analyzer.llist.get(i);//|....i;SemanticAnalysis.j i;data2 SemanticAnalysis.expression();//表达式SemanticAnalysis.elements.add(new Element(if, data1, op, data2, SemanticAnalysis.elements.size() 2));E();}static void S() {if (analyzer.map2.get(analyzer.llist.get(i)) 10)A();else if (analyzer.llist.get(i).equals(while))C();else if (analyzer.llist.get(i).equals(if)) {B();}i;S1();// if(s[i]!e) {// }
/* if(Objects.equals(analyzer.llist.get(i), ;)) {}else {System.out.println(error!-----------缺少结尾符号;程序第analyzer.map.get(i)行出现语法错误);error;i;S1();}*/}static void S1() {if (i analyzer.llist.size() !Objects.equals(analyzer.llist.get(i), end)) {// i;S();}}static void A() {if (i 1 analyzer.llist.size() Objects.equals(analyzer.llist.get(i 1), :)) {String times analyzer.llist.get(i), data1;SemanticAnalysis.j i;SemanticAnalysis.j 2;data1 SemanticAnalysis.expression();//表达式SemanticAnalysis.memset(times, data1, , );i;i;E();if (Objects.equals(analyzer.llist.get(i), )) || Objects.equals(analyzer.llist.get(i), ;)) {if (Objects.equals(analyzer.llist.get(i), ))) {i;}} else {System.out.println(error!--------不是结尾符号或者 程序第 analyzer.map.get(i) analyzer.llist.get(i) 行出现语法错误);error;i;}} else {System.out.println(error!---------不是赋值语句 程序第 analyzer.map.get(i) 行出现语法错误);error;i;i;E();if (Objects.equals(analyzer.llist.get(i), )) || Objects.equals(analyzer.llist.get(i), ;)) {if (Objects.equals(analyzer.llist.get(i), ))) {i;}} else {System.out.println(error!--------不是结尾符号或者 程序第 analyzer.map.get(i) 行出现语法错误);error;i;}}}static void E() {T();/* if(Objects.equals(analyzer.llist.get(i), ) || Objects.equals(analyzer.llist.get(i), -) || Objects.equals(analyzer.llist.get(i), ;) || Objects.equals(analyzer.llist.get(i), ))) {*/E1();/* }else {System.out.println(error!-----------不是结尾符号或者-或者或者程序第analyzer.map.get(i)行出现语法错误); error;E1();}*/}static void T() {F();if (Objects.equals(analyzer.llist.get(i), ) || Objects.equals(analyzer.llist.get(i), -) || Objects.equals(analyzer.llist.get(i), ;) || Objects.equals(analyzer.llist.get(i), )) || Objects.equals(analyzer.llist.get(i), *) || Objects.equals(analyzer.llist.get(i), /)) {T1();}}static void F() {if (Objects.equals(analyzer.llist.get(i), ()) {i;E();} else {i;}}static void T1() {if (Objects.equals(analyzer.llist.get(i), *)) {i;F();T1();} else if (Objects.equals(analyzer.llist.get(i), /)) {i;F();T1();}}static void E1() {if (Objects.equals(analyzer.llist.get(i), )) {i;T();E1();} else if (Objects.equals(analyzer.llist.get(i), -)) {i;T();E1();}}public static void main(String[] args) {Scanner sc new Scanner(System.in);System.out.println(词法分析程序);System.out.println(从文件中读取程序);System.out.println();analyzer.initToken();analyzer.ReadFile1();System.out.println(语法分析中....,请稍候);i 0;sing 0;if (Objects.equals(analyzer.llist.get(0), #)) System.exit(-1);P();if (Objects.equals(analyzer.llist.get(i), #)) {} else {System.out.println(error!-------不是结尾符号# analyzer.llist.get(i) i);error;}System.out.println(词法分析完成);System.out.println(语法分析完成共检查出 error 个语法错误);System.out.println(\n中间代码生成结果);for (int i 0; i SemanticAnalysis.elements.size(); i) {Element e SemanticAnalysis.elements.get(i);if (e.times null)System.out.println(i : goto e.integer);else if (e.times.equals(if))System.out.println(i : e.times e.data1 e.op e.data2 goto e.integer);elseSystem.out.println(i : e.times e.data1 e.op e.data2);}}}
词法分析
public class analyzer {public static ListString llistnew ArrayList();static MapInteger,Integer mapnew HashMap();static MapString,Integer map2new HashMap();final static String ID \\p{Alpha}(\\p{Alpha}|\\d)*;static int countLine1;/** 整形常数 NUM 正则表达式*/final static String NUM \\d\\d*;final static String regex ^-?([1-9]\\d*\\.\\d*|0\\.\\d*[1-9]\\d*|0?\\.0|0)$;/** token 词法单元* 词符号 种别码 *//** 关键字 token*/static MapString, Integer TOKEN_KEYWORDS;/** 运算符/界符 token */static MapString, Integer TOKEN_OPERATOR_BOUNDARY;/** 其他单词 token*/static MapString, Integer TOKEN_ID_SUM;/** 文件根目录*/static final String ROOT_DIRECTORY program.txt;/*** 初始化 token 单元*/public static void initToken(){//种别码创建TOKEN_KEYWORDS new HashMapString, Integer(){//关键字{put(begin, 1);put(if, 2);put(then, 3);put(while, 4);put(do, 5);put(end, 6);}};TOKEN_OPERATOR_BOUNDARY new HashMapString, Integer(){//运算符和界符{put(, 13);put(-, 14);put(*, 15);put(/, 16);put(:, 17);put(:, 18);put(, 20);put(, 21);put(, 22);put(, 23);put(, 24);put(, 25);put(;, 26);put((, 27);put(), 28);put(#, 0);}};TOKEN_ID_SUM new HashMapString, Integer(){//标识符和整型常数{put(ID, 10);put(NUM, 11);}};}/*** 读 源程序 文件*/public static void ReadFile1() {FileInputStream fis null;InputStreamReader isr null;BufferedReader br null;try {fis new FileInputStream(ROOT_DIRECTORY);isr new InputStreamReader(fis, UTF-8); // 转化类br new BufferedReader(isr); // 装饰类String line;/** 记录 程序 行数 */while ((line br.readLine()) ! null) { // 每次读取一行分析一行boolean answer lexicalAnalysis(line);if(answer false){System.out.printf(ERROR 编译错误 第 %d 行出现 词法错误 \n, countLine);break;}countLine;}System.out.printf(词法分析完成\n);} catch (Exception ex) {ex.printStackTrace();} finally {try {br.close(); // 关闭最后一个类会将所有的底层流都关闭} catch (Exception ex) {ex.printStackTrace();}}}/** 判断key是否是其他单词*/private static boolean isIDOrSUM(String key){if (key.matches(ID) ) {llist.add(key);map.put(llist.size()-1,countLine);map2.put(key,TOKEN_ID_SUM.get(ID));System.out.printf((%d, %s)\n, TOKEN_ID_SUM.get(ID), key);}else if (key.matches(NUM)||key.matches(regex)) {llist.add(key);map.put(llist.size()-1,countLine);map2.put(key,TOKEN_ID_SUM.get(NUM));System.out.printf((%d, %s)\n, TOKEN_ID_SUM.get(NUM), key);}else {return false;}return true;}/*** 进行 词法分析* param word 要分析的字符串* return 结果*/public static boolean lexicalAnalysis(String word){word word.trim(); // 去首尾空格String[] strings word.split(\\p{Space}); // 分割字符串保证处理的字符串没有空格for (String string : strings) {/** 3种情况* 1. 关键字 end 关键字的后面一定是空格 * 2. 运算符/ 分界符 continue* 3. 其他单词 continue*/String key ;for (int i 0; i string.length(); i){String indexChar String.valueOf(string.charAt(i)) ;if(i1string.length()){if((indexCharstring.charAt(i1)).equals(//))return true;}/** 是 运算符 或者 关键字*/if (TOKEN_OPERATOR_BOUNDARY.containsKey(indexChar) ||TOKEN_KEYWORDS.containsKey(string.substring(i, string.length()))){if (key.length() 0) {if (isIDOrSUM(key) false) {/** 词法错误 */return false;}key ;}if(TOKEN_OPERATOR_BOUNDARY.containsKey(indexChar)) {/** 1. 是 运算符/分界符 */key indexChar;if(i 1 string.length() TOKEN_OPERATOR_BOUNDARY.containsKey(indexChar string.charAt(i1))){ // 运算分界符key string.charAt(i);}llist.add(key);map.put(llist.size()-1,countLine);map2.put(key,TOKEN_OPERATOR_BOUNDARY.get(key));System.out.printf((%d, %s)\n,TOKEN_OPERATOR_BOUNDARY.get(key),key);key ;}else if(TOKEN_KEYWORDS.containsKey(key string.substring(i, string.length()))) {/** 2. 是关键字*/llist.add(key);map.put(llist.size()-1,countLine);map2.put(key,TOKEN_KEYWORDS.get(key));System.out.printf((%d, %s)\n,TOKEN_KEYWORDS.get(key),key);key ;break;}}else {/** 是其他单词*/key indexChar;/** 其他单词后面是 1. 换行2. 运算符/界符 3. 其他单词*/if(i1 string.length()){if (isIDOrSUM(key) false) {/** 词法错误 */return false;}}}}}return true;}public analyzer() {}public static void main(String[] args) {initToken();System.out.println(词法分析程序);System.out.println(从文件中读取程序);System.out.println();ReadFile1(); for(String s:llist) System.out.println(s);System.out.println();}}
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/921241.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!