编译原理 LL1文法First集算法实现

简介: import java.util.LinkedHashMap; import java.util.Map; import java.util.Set; import java.util.TreeMap; import java.
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
import java.util.TreeSet;

public class First {
    private Map<String, Set<Character>> first = new TreeMap<String, Set<Character>>();
    private Map<String, String[]> mp = null;
    public First(Map<String, String[]> mp) {
        super();
        this.mp = mp;
    }
    public Map<String, Set<Character>> getFirstSet(){
        return first;
    }
    private Set<Character> findFirst(String curNode, String[] rightNodes){
         if(first.containsKey(curNode)) return first.get(curNode); 
         Set<Character> st = new TreeSet<Character>();
         for(int i=0; i<rightNodes.length; ++i){
                for(int j=0; j<rightNodes[i].length(); ++j){
                    String nextNode = ""+rightNodes[i].charAt(j);
                    if(!mp.containsKey(nextNode)){//终结点
                        st.add(nextNode.charAt(0));
                        break;
                    }
                    else{//非终结点
                        if(j+1<rightNodes[i].length() && rightNodes[i].charAt(j+1)=='\''){
                            nextNode += rightNodes[i].charAt(j+1);
                            ++j;
                        }
                        if(mp.containsKey(nextNode)){
                            Set<Character> tmpSt = findFirst(nextNode, mp.get(nextNode));
                            st.addAll(tmpSt);
                            if(!tmpSt.contains('$'))
                                break;
                        }
                    }
                }
         }
         first.put(curNode, st);
         return st;
    }
    
    public String firstKernealCode(){
         String content = "";
         for(String leftNode : mp.keySet()){
             String[] rightNodes = mp.get(leftNode);
             findFirst(leftNode, rightNodes);
         }
         //打印first集合
         System.out.println("First集合如下:");
         for(Map.Entry<String, Set<Character>> entry : first.entrySet()){
             content += entry.getKey() + "  :  " + entry.getValue() + "\n";
             System.out.println(entry.getKey() + "  :  " + entry.getValue());
         }
         return content;
    }
    
    public static void main(String[] args){
//        String[] rightLinearGrammar = {
//                "E->TE\'",
//                "E\'->+TE\'|$",
//                "T->FT\'",
//                "T\'->*FT\'|$",
//                "F->(E)|i"
//        };
        
        String[] rightLinearGrammar = {
                "S->ABc",
                "A->a|$",
                "B->b"
        };
        Map<String, String[]> mp = new LinkedHashMap<String, String[]>();
        try{
            for(int i=0; i<rightLinearGrammar.length; ++i){
                String split1[] = rightLinearGrammar[i].split("->");
                String split2[] = split1[1].split("\\|");
                mp.put(split1[0], split2);
            }
            
        } catch(Exception e){
            e.printStackTrace();
            System.out.println("右线性文法错误!");
        }
        new First(mp).firstKernealCode();
    }
}

 

目录
相关文章
|
Linux 开发工具 Android开发
FFmpeg开发笔记(六十)使用国产的ijkplayer播放器观看网络视频
ijkplayer是由Bilibili基于FFmpeg3.4研发并开源的播放器,适用于Android和iOS,支持本地视频及网络流媒体播放。本文详细介绍如何在新版Android Studio中导入并使用ijkplayer库,包括Gradle版本及配置更新、导入编译好的so文件以及添加直播链接播放代码等步骤,帮助开发者顺利进行App调试与开发。更多FFmpeg开发知识可参考《FFmpeg开发实战:从零基础到短视频上线》。
2201 2
FFmpeg开发笔记(六十)使用国产的ijkplayer播放器观看网络视频
|
传感器 物联网 芯片
PWM 在智能照明系统中的应用优势有哪些
PWM(脉冲宽度调制)在智能照明系统中应用广泛,其优势包括:精准控制亮度、色温调节灵活、节能高效、延长灯具寿命、响应速度快及成本低廉。这些特点使其成为智能照明的理想选择。
|
应用服务中间件 Windows
震惊!idea 2021 社区版手把手安装,超详细过程,新手一看就会 如何安装低版本的IDEA? IDEA安装过程中版本冲突怎么办 idea最新版安装!
本文提供了一个详细的指南,用于安装2021年社区版的IntelliJ IDEA,包括如何处理版本冲突和完成安装过程。
2401 2
震惊!idea 2021 社区版手把手安装,超详细过程,新手一看就会 如何安装低版本的IDEA? IDEA安装过程中版本冲突怎么办 idea最新版安装!
UE虚幻引擎 UTextBlock UMG文本控件超过边界区域以后显示省略号
UE虚幻引擎 UTextBlock UMG文本控件超过边界区域以后显示省略号
687 0
|
机器学习/深度学习 人工智能 数据挖掘
AI精通Python365天第1课,揭秘难易度
学习Python能显著提升就业竞争力,实现工作自动化,增强数据分析、机器学习、Web开发等技能,促进跨领域应用和个人成长。无论是职场新人还是资深人士,掌握Python都能带来正向的职业发展和收入增长,同时回馈社会。通过AI辅助学习Python,从基础代码开始实践,逐步提升编程能力,让技术成为个人发展的强大助力。
271 1
|
存储 人工智能 自然语言处理
AI Agent框架(LLM Agent):LLM驱动的智能体如何引领行业变革,应用探索与未来展望
【7月更文挑战第2天】AI Agent框架(LLM Agent):LLM驱动的智能体如何引领行业变革,应用探索与未来展望
AI Agent框架(LLM Agent):LLM驱动的智能体如何引领行业变革,应用探索与未来展望
|
自然语言处理 Java API
"告别Java8 Stream噩梦,JDFrame神器来袭!让你的代码简洁如诗,效率翻倍,编程新体验等你尝鲜!"
【8月更文挑战第11天】Java 8的Stream API以强大的函数式编程能力革新了集合数据处理方式,但其抽象概念和复杂的链式调用让不少开发者望而却步。为此,JDFrame框架应运而生,通过直观易懂的操作符简化Stream使用,减少代码量并提高效率。
656 3
|
JavaScript Java 测试技术
基于小程序的校园工会体育报名系统+springboot+vue.js附带文章和源代码设计说明文档ppt
基于小程序的校园工会体育报名系统+springboot+vue.js附带文章和源代码设计说明文档ppt
184 0
|
Shell Linux C语言
【Shell 命令集合 系统设置 】⭐Linux 向内核中加载指定的模块 insmod命令 使用指南
【Shell 命令集合 系统设置 】⭐Linux 向内核中加载指定的模块 insmod命令 使用指南
577 0
|
存储 缓存 Kubernetes
harbor 部署入门指南(1)
harbor 部署入门指南(1)
harbor 部署入门指南(1)

热门文章

最新文章