首页 > 其他分享 >自底向上的语法分析,闭包、GOTO函数

自底向上的语法分析,闭包、GOTO函数

时间:2023-10-29 10:55:32浏览次数:35  
标签:闭包 底向上 语法分析 GOTO Item setOfItems item SetOfItems result

自底向上的语法分析

一、一个串ω归约(reduction)为文法开始符号的过程

关键问题:

  1.何时进行规约,2.用哪个产生式规约

句柄右边的串ω一定只包含终结符号。

如果文法是无二义性的,那么文法的每个右句型都有且只有一个句柄

二、LR(0) 自动机 Automaton

1.定义:产生式加上位于体中的点

2.项的分类

1)内核项:初始项S’ -> • S,点不在最左端的项

2)非内核项:除S’ -> • S之外的点在最左端的项

项集I的闭包

1)将I中各个项加入到CLOSURE(I)中

2)如果A ->α • Bβ在CLOSURE(I)中,B->γ 是一个产生式,并且B->• γ不在CLOSURE(I)中,就将这个项加入其中。

不断应用这个规则,直到没有新项加入。

GOTO函数

GOTO(I,X) 定义:I 中所有形如A ->α • Xβ的项所有对应的项A ->αX • β的集合的闭包

代码实现:

/**
     * P156 闭包
     * @param setOfItems
     * @return
     */
    public SetOfItems closure(SetOfItems setOfItems, Grammar grammar) {

        SetOfItems result = new SetOfItems();
        for (Item item : setOfItems.getItems()) {
            result.add(item);
        }

        boolean hasAdd;
        do {
            hasAdd = false;
            Set<Item> items = new HashSet<>(result.getItems());
            for (Item item : items) {

                Symbol symbolAfterDot = item.getSymbolAfterDot();
                if (symbolAfterDot == null) {
                    continue;
                }

                if (symbolAfterDot instanceof Nonterminal) {
                    List<Production> productionList = grammar.getProduction((Nonterminal) symbolAfterDot);
                    for (Production production : productionList) {
                        Item newItem = Item.of(production, 0);
                        if (result.contains(newItem)) {
                            continue;
                        }
                        result.add(newItem);
                        hasAdd = true;
                    }
                }
            }

        } while (hasAdd);

        return result;
    }

 GOTO函数

/**
     * P156 GOTO函数
     * @return
     */
    public SetOfItems gotoSet(Grammar grammar, SetOfItems setOfItems, Symbol symbol) {

        SetOfItems result = new SetOfItems();
        for (Item item : setOfItems.getItems()) {
            Symbol symbol1 = item.getSymbolAfterDot();
            if (symbol1 == null) {
                continue;
            }
            if (!symbol1.equals(symbol)) {
                continue;
            }
            result.add(Item.of(item, item.pos+1));
        }

        if (result.isEmpty()) {
            return null;
        }

        result = closure(result, grammar);

        return result;
    }

 

标签:闭包,底向上,语法分析,GOTO,Item,setOfItems,item,SetOfItems,result
From: https://www.cnblogs.com/kashin/p/17793264.html

相关文章

  • 经典闭包
     先看常见的问题internalclassProgram{staticvoidMain(string[]args){varactions=GetSomeAction();for(inti=0;i<actions.Count;i++)actions[i]();}staticList<Action>GetSomeAction(){......
  • 编译原理-语法分析-自上而下分析
    语法分析器的功能语法分析器是编译过程的核心部分。任务是在词法分析识别出的单词符号串的基础上,分析并判定程序的语法结构是否符合语法规则。自上而下分析面临的问题左递归P->Pa:会使程序陷入死循环试探法就是穷举所有可能,一旦遇到不匹配就进行回溯,尝试下一种可能,这种方......
  • JS加密/解密之闭包的运用
    深入探讨JavaScript闭包的演变与应用摘要:本文将深入探讨JavaScript闭包的概念、特性以及其在实际开发中的应用。我们将从闭包的起源开始,探讨它在JavaScript编程中的重要性,并通过实例展示闭包在不同场景下的灵活应用。引言JavaScript作为一种高度灵活的编程语言,一直以其独特的特性......
  • 从闭包谈到高阶函数
    1闭包的概念闭包是由一个函数以及与其相关的引用环境组合而成的实体。闭包可以在函数内部访问外部函数的变量,并且这些变量可以在外部函数执行结束后仍然保持其状态。听起来可能有点抽象,咱们来段代码:functionouterFunction(x){returnfunctioninnerFunction(y){ret......
  • 装饰器、闭包
    用到了老是忘记,还是记录一下吧,装饰器、闭包python的装饰器、闭包是进入Python高级语法的基础,使用装饰器之前,有以下条件:存在闭包存在需要被装饰的函数理解函数地址的概念理解函数的地址值众所周知,我们定义函数后,函数名加()可以调用函数,那么我们尝试调用一下函数名呢?def......
  • Go 匿名函数与闭包
    Go匿名函数与闭包匿名函数和闭包是一些编程语言中的重要概念,它们在Go语言中也有重要的应用。让我们来详细介绍这两个概念,并提供示例代码来帮助理解。目录Go匿名函数与闭包一、匿名函数(AnonymousFunction)二、闭包函数(Closure)一、匿名函数(AnonymousFunction)匿名函数,也称为无......
  • C++不常见语法分析总结
    成员初始化列表用于在构造对象时给类或者结构体成员设置初值。语法为:构造函数():成员1(参数值1),成员2(参数值2)...{}成员初始化列表的作用和优点:可以为非静态数据成员赋予初始值初始化顺序与成员在类中的定义顺序一致效率比在构造函数体内赋值初始化高可以为只......
  • 深入浅出JavaScript闭包
    什么是JS闭包?JS闭包是一个难点也是JS的特色,是JS的高级特性。首先我们知道JS运行函数的时候会在内存中开辟一个存储空间,会把函数体内的代码当作字符串一摸一样的放在这个空间中,把这个空间地址赋值给函数名(变量名),当我们调用函数的时候会根据地址找到这个储存空间,然后执行储存空......
  • 闭包使用场景
    闭包在JavaScript中有许多应用场景,它们可以帮助你解决各种问题,包括封装数据、创建模块、处理异步操作等。以下是一些常见的闭包应用场景:封装私有变量和方法:使用闭包可以创建对象,其中包含私有成员变量和方法,这些成员对外部代码不可见。这有助于实现信息隐藏和数据封装。functi......
  • Day16 函数对象--函数嵌套调用--闭包函数
    1.Day15_复习1: 2.Day15_复习2: 3.Day15_复习3: 4.函数对象_可以赋值_可以当做函数参数传给另外一个函数: 5.函数对象_可以当做函数另外一个函数的返回值_可以当做容器类型的一个元素: 6.函数对象初步实现ATM流程: 7.函数对象应用案例优化: 8.函数的嵌套调用: 9.......