首页 > 其他分享 >语法制导的应用

语法制导的应用

时间:2023-12-28 23:11:49浏览次数:43  
标签:Node StateStackItem 语法 item production LogUtil 应用 制导 stateStack

语法制导的实现可以有很多中,如后缀翻译方案,L属性定义的SDT,遍历语法分析树

这里选择使用语法分析树来实现,即

1.建立一棵语法分析树

2.按照从左到右的深度优先顺序执行动作

3.产生式体中的动作在它左边的所有文法符号都被匹配之后立刻执行

这样选择的理由是,非常通用任何SDT都可以实现

一、首先改造之前的语法分析,在分析过程中构造一个语法分析树,在分析完成后返回根节点

语法分析树是推导的图形表示形式,每个内部结点表示一个产生式的应用。

因此,只要在使用产生式进行规约时生成相应树结构就可以完成构造

public Node parseWithNode(Grammar grammar, List<Symbol> inputs, ParsingTable table) {
        LinkedList<Symbol> inputQueue = new LinkedList<>(inputs);
        inputQueue.addLast(Terminal.dollar);

        // 符号栈 (方便打印)
        Stack<Symbol> symbolStack = new Stack<>();
        final int initStateCode = 0;// 初始状态
        // 状态栈
        Stack<StateStackItem> stateStack = new Stack<>();
        stateStack.push(StateStackItem.of(initStateCode));

        while (true) {
            StateStackItem state = stateStack.peek();// 当前状态
            printStack(state, symbolStack, inputQueue);

            Symbol symbol = inputQueue.getFirst();
            Action action = table.getAction(state.getState(), symbol);
            if (action instanceof ShiftAction) {// 移入
                inputQueue.removeFirst();

                ShiftAction shiftAction = (ShiftAction) action;
                stateStack.push(StateStackItem.of(shiftAction.getToId()));
                symbolStack.push(symbol);

                LogUtil.print("移入:" + shiftAction.getToId());
                LogUtil.newline();
            } else if (action instanceof ReduceAction) {// 规约
                ReduceAction reduceAction = (ReduceAction) action;
                Production production = reduceAction.getProduction();

                Node node = Node.of(production.getHead());
                node.setProduction(production);
                for (Symbol bo : production.getBody()) {
                    if (bo.equals(Terminal.epsilon)) {// 形如 E -> ·ε,不需要弹出产生式的体,直接进行规约
                        continue;
                    }
                    StateStackItem item = stateStack.pop();
                    Symbol childSymbol = symbolStack.pop();
                    Node child;
                    if (item.getValue() == null) {// 终结符
                        child = Node.of(childSymbol);
                    } else {
                        child = (Node) item.getValue();
                    }
                    // 由于符号栈的顶端时产生式体的右边,将后面的节点添加到子节点列表的前面,即左边
                    node.addChildFirst(child);
                }
                symbolStack.push(production.getHead());

                state = stateStack.peek();
                Integer gotoState = table.gotoSet(state.getState(), production.getHead());
                StateStackItem item = StateStackItem.of(gotoState);
                item.setValue(node);
                stateStack.push(item);

                LogUtil.print("规约:" + production + " GOTO:" + gotoState);
                LogUtil.newline();

            } else if (action instanceof AcceptAction) {
                LogUtil.print("接受");
                LogUtil.newline();
                return (Node) stateStack.peek().getValue();
            } else {
                LogUtil.print("错误");
                LogUtil.newline();
                return null;
            }
        }
    }

  

标签:Node,StateStackItem,语法,item,production,LogUtil,应用,制导,stateStack
From: https://www.cnblogs.com/kashin/p/17931697.html

相关文章

  • 基础语法
    一些基础语法定义变量、常量、赋值、运算、if/switch/for语句//syntaxpackagemain//入口import"fmt"//引入包funcmain(){//main语言入口函数constLENGTHint=10//定义常量,常量不能被修改//常量中的数据类型只可以是布尔型、数字型(整数型、浮......
  • 【Python高级应用课程设计 】大数据分析——中国时尚购物的动机
    选题背景:时尚购物在中国的消费市场中占据了重要地位,并且受到越来越多消费者的追捧。中国消费者在时尚购物方面的动机是什么,了解其背后的原因和驱动力对于了解中国市场、时尚行业的发展趋势以及消费者行为具有重要意义。本选题旨在探讨中国时尚购物的动机。时尚购物在中国的兴盛......
  • 基于DID实现第三方应用的分布式身份登录
    在我们掌握了DID的基础知识(还没有掌握DID基础知识?请先阅读我之前的关于DID的文章),构建DID平台的时候,DID的常见应用就是基于DID实现第三方平台的登录。接下来,我们假设已经构建了一个基础的DID平台,用长安链实现了DID文档的链上管理,并提供了DID钱包托管用户的公私钥和VC证书,建设全新的......
  • 仪表盘、数据分析新增分享功能及应用服务下新增服务实例菜单
    近期,博睿数据根据一体化智能可观测平台BonreeONE产品本身,以及用户反馈进行持续的更新和优化。以下为BonreeONE产品功能更新报告第03期内容,更多探索,未完待续。本次迭代的更新集中在平台的仪表盘、数据分析新增分享功能,用户可以将仪表盘和报表分享给其他用户,方便团队协作和数据......
  • 分布式I/O在汽车制造领域的应用
    随着制造行业的不断发展和技术进步,生产线的复杂性和智能化需求越来越高。分布式I/O技术,作为现代工业自动化的重要组成部分,正逐渐在制造行业中展现出其独特的优势和应用价值。在制造行业,传统集中式控制系统存在着信号传输延迟、布线复杂、扩展性差等问题。随着生产线规模的扩大和智......
  • 【python爬虫课程设计】大数据分析———Apple AppStore Android 应用数据分析
    一、选题背景    随着智能手机的普及,移动应用市场持续繁荣,其中苹果AppStore和谷歌GooglePlay是全球最大的两大应用商店。这两大平台汇聚了数十亿的活跃用户,为开发者提供了展示和分发应用的平台。对于开发者而言,了解应用在AppStore和GooglePlay上的表现和用户行为至关......
  • Ios苹果开发人员已从app应用程序移除怎么恢复
    Hello亲爱的朋友们大家好!我是咕噜的铁蛋!我经常与各种开发者和用户交流,探讨关于苹果设备和应用的问题。最近,我发现许多开发人员都遇到了一个问题:他们的应用程序被苹果从AppStore中移除了。这对于开发者来说无疑是一个巨大的打击,因为他们花费了大量的时间和精力来开发这些应用程序,并......
  • 蓝牙资产标签之智慧医院应用
    近几年,随着IOT技术的迅速发展,推动资产追踪和其他物联网技术的部署量激增。根据近两年的政策和实际需求来看,医院资产追踪解决方案部署应用日益增长。医疗行业的资产追踪医疗行业的应用能够充分体现蓝牙资产追踪潜力。是否能够以最快速度找到重要设备或关键药物,关系着患者的生命。蓝......
  • 蓝牙资产标签之智慧工厂应用
    近几年,随着IOT技术的迅速发展,推动资产追踪和其他物联网技术的部署量激增。根据近两年的政策和实际需求来看,大型工厂是资产追踪解决方案部署的最大市场。制造业的资产追踪互联设备的普及正在提高许多垂直行业的效率和投资回报率,并对工程和制造运营产生显著的影响。通过增加位置应用,......
  • TSINGSEE青犀智能分析网关V4在智慧小区场景中的应用
    一、方案背景随着物联网、AI、大数据、5G、边缘计算、移动互联网等新兴技术的不断成熟和应用,社区作为汇聚科技社会人、房、车三大物联网时代最核心的要素,其价值将不言而喻。建设智慧小区需要充分发挥信息技术在社区管理中的作用,提高居民生活的便利性和安全性,例如建设和利用视频监......