日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

消除文法中一切左递归算法

發布時間:2025/4/9 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 消除文法中一切左递归算法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

  第一次寫博客。。。編譯原理課的一個實驗。

  感覺自己花了挺長的時間,所以作為博客保留下來,挺有紀念意義的??(因為我是菜鳥)

package com.insist.entity;import java.util.ArrayList; import java.util.List; import java.util.Scanner;/*** * @author SNOOPY 消除一切左遞歸*/ public class EliminateLeftRecursion {private static int n;// 實際輸入產生式個數public static void main(String[] args) {Scanner scan = new Scanner(System.in);System.out.println("請輸入產生式個數:");n = scan.nextInt();// 創建產生式數組存放輸入的產生式List<Regular> regulars = new ArrayList<Regular>();for (int i = 0; i < n; i++) {Regular reg = new Regular();System.out.println("請輸入產生式左部:");String left = scan.next();reg.setLeft(left);System.out.println("請輸入產生式的右部:");String right = scan.next();reg.setRight(right);regulars.add(reg);}/** 測試輸出------->成功 for (Regular reg: regulars) { System.out.println(reg.getLeft()+"---->"+reg.getRight()); }*/// 構造一個字符型的數組用來存放排序好的非終結符String[] Vn = new String[50];// 對所有的產生式按照一定的順序存放Vn[0] = regulars.get(0).getLeft();// 把產生式第一個非終結符放到集合中int flag = 0;int count = 0;for (int i = 1; i < n; i++) {// 對非終結符排序并存取 1、遍歷產生式數組for (int j = 0; j < i; j++) {// 如果產生式左部等于在它前面的產生式的左部if (regulars.get(i).getLeft().equals(regulars.get(j).getLeft())) {// 說明有重復的flag++;}}if (flag == 0) {// 說明沒有重復,則加入非終結符數組中count++;Vn[count] = regulars.get(i).getLeft();}flag = 0;}/** 測試非終結符數組------------>成功 for (int i = 0; i < Vn.length; i++) { if(Vn[i]!=null){ System.out.println(Vn[i]); } }*/for (Regular reg : regulars) {if (reg != null) {System.out.println(reg.getLeft() + "---->" + reg.getRight());}}regulars = subFunction(regulars, Vn, count);for (Regular reg : regulars) {if (reg != null) {System.out.println(reg.getLeft() + "---->" + reg.getRight());}}}public static List<Regular> subFunction(List<Regular> regulars, String[] Vn, int count) {int flag = 0;// 判斷是否存在間接左遞歸并轉化為直接左遞歸for (int i = 0; i <= count; i++) {// 對每一個非終結符 迭代for (int j = 0; j < i; j++) {// 對每一個小于i的非終結符遍歷for (int k = 0; k < regulars.size(); k++) // 對每一個產生式if (Vn[i].equals(regulars.get(k).getLeft())) {// i非終結符與第k產生式左邊第一個字母相等-->鎖定非終結符集合中的一個非終結符的產生式if (regulars.get(k).getRight().substring(0, 1).equals(Vn[j])) { // g產生式右邊產生式第一個符號與第j個非終結符相等-->說明存在間接左遞歸for (int h = 0; h < regulars.size(); h++) {if (regulars.get(h).getLeft().equals(Vn[j])) {// 進行替換 String str;str = regulars.get(k).getRight().substring(1);// 截取右邊第一個以后的字符Regular reg = new Regular();reg.setLeft(regulars.get(k).getLeft());reg.setRight(regulars.get(h).getRight() + str);regulars.add(reg);}}regulars.remove(k);}}}}// 消除所有直接左遞歸for (int i = 0; i <= count; i++) {flag = 0;for (int j = 0; j < regulars.size(); j++) {// 判斷是否存在直接左遞歸if (regulars.get(j).getLeft().equals(Vn[i])) {System.out.println(regulars.get(j).getLeft() + " ======= " + Vn[i]);if (regulars.get(j).getLeft().equals(regulars.get(j).getRight().substring(0, 1))) {System.out.println("消除間接左遞歸后存在直接左遞歸");flag++;}}}if (flag != 0) {// 存在直接左遞歸for (int j = 0; j < regulars.size(); j++) {if (regulars.get(j).getLeft().equals(Vn[i])) {// 尋找與存在直接左遞歸的非終結符左部相同的的產生式if (regulars.get(j).getLeft().equals(regulars.get(j).getRight().substring(0, 1))) {// 直接左遞歸的產生式String str = regulars.get(j).getRight().substring(1);String temp = regulars.get(j).getLeft();String temp1 = "'";regulars.get(j).setLeft(temp + temp1);regulars.get(j).setRight(str + regulars.get(j).getLeft());Regular reg = new Regular();reg.setLeft(regulars.get(j).getLeft());reg.setRight("ε");regulars.add(reg);} else {String temp = regulars.get(j).getLeft();String temp1 = "'";temp = temp + temp1;regulars.get(j).setRight(regulars.get(j).getRight() + temp);}}}}}return regulars;} } package com.insist.entity;import java.io.Serializable;/*** * @author SNOOPY**/ public class Regular implements Serializable {private static final long serialVersionUID = 1L;private String right;// 定義產生式右部private String left;// 定義產生式左部public String getRight() {return right;}public void setRight(String right) {this.right = right;}public String getLeft() {return left;}public void setLeft(String left) {this.left = left;} }

?

轉載于:https://www.cnblogs.com/snoopylovefiona/p/4593726.html

總結

以上是生活随笔為你收集整理的消除文法中一切左递归算法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 素人一区 | 色婷婷精品久久二区二区密 | 亚洲综合视频在线播放 | 午夜高清福利 | 欧美日韩大片在线观看 | www.蜜臀 | 激情伦成人综合小说 | 羞羞的视频在线观看 | 黄色动漫在线观看 | 欧美精品v国产精品v日韩精品 | 国产精品久久久久久久久久久久久久久久久久 | 国产无码精品一区二区 | 毛片其地| 亚洲欧美系列 | 岛国av一区 | a在线观看视频 | 国产精品成人网 | 韩国黄色av | 国产精品99久久久久久人 | 亚洲影院一区 | 影音先锋中文字幕在线 | 老司机精品视频在线播放 | 蜜桃久久久久久 | 国产在成人精品线拍偷自揄拍 | 久久久无码18禁高潮喷水 | 萌白酱喷水视频 | 欧美成网 | 国产经典三级 | 91九色蝌蚪视频 | 国产精品日日摸天天碰 | 性一交一乱一透一a级 | 成人高清网站 | 黄色第一网站 | 免费黄在线 | 黄色免费网站在线观看 | 婷婷综合国产 | 成人免费大片黄在线播放 | 激情综合网婷婷 | 成人免费视频网站 | 国自产拍偷拍精品啪啪一区二区 | 人妻少妇精品无码专区 | 亚洲欧美天堂 | 人体裸体bbbbb欣赏 | 日日干夜夜爽 | 99热网址| 久久精品66 | 国产乱淫a∨片免费观看 | 国产精品观看 | 亚洲欧美制服丝袜 | 国产片网址 | 青娱乐最新视频 | 亚洲第一伊人 | 人妻少妇精品中文字幕av蜜桃 | www.国产毛片 | 欧美无砖砖区免费 | 熟妇人妻系列aⅴ无码专区友真希 | 日韩性欧美 | 男女无遮挡免费视频 | 亚洲综合中文字幕在线 | 枫可怜av | 久久精品视频一区二区三区 | 欧美一页 | 狠狠综合| 日本成人综合 | 欧美日韩在线免费 | 日韩人妻精品一区二区 | 免费国产a | 99riav3国产精品视频 | 在线视频区 | 夜夜操夜夜摸 | 校园春色综合网 | 久久老司机 | 亚洲特级毛片 | 国产麻豆成人传媒免费观看 | 激情五月婷婷 | 免费超爽大片黄 | 善良的女朋友在线观看 | 欧美手机在线观看 | 国产高中女学生第一次 | 看av网站 | 精品热久久 | 黄色一级大片在线免费看国产一 | 欧美日韩中文字幕一区二区 | 老色批av | 窝窝午夜影院 | 四虎精品一区 | 国内av| 国产精品久久久久久久 | 日韩欧美一级片 | 国产性70yerg老太 | 亚洲免费色 | 伊人草 | 激情综合图 | 成年人毛片 | 亚洲成人动漫在线观看 | 色天堂在线视频 | 欧美香蕉在线 | www日本高清 | 日韩av网址大全 |