首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何编写上下文无关文法?

如何编写上下文无关文法?
EN

Stack Overflow用户
提问于 2021-06-29 21:15:02
回答 2查看 53关注 0票数 0

我这里有两节课。

CFG类在其定义上下文无关语法的构造函数中接受一个字符串数组。SampleTest类用于测试CFG类,方法是将语法(C)输入到类中,然后由用户输入一个字符串,并查看该字符串是否可以由上下文无关文法生成。

我遇到的问题是堆栈溢出(很明显)。我假设我刚刚创建了一个永无止境的递归函数。

谁能看一下processData()函数,并帮我弄清楚如何正确地配置它。我基本上是使用递归来生成CFG可以创建的字符串的所有可能性,然后如果生成的可能性之一与用户的输入(inString)匹配,则返回true。哦,wkString参数就是语法在每次递归迭代中生成的字符串。

代码语言:javascript
运行
AI代码解释
复制
public class SampleTest {
  public static void main(String[] args) {
    // Language: strings that contain 0+ b's, followed by 2+ a's,
    // followed by 1 b, and ending with 2+ a's.
    String[] C = { "S=>bS", "S=>aaT", "T=>aT", "T=>bU", "U=>Ua", "U=>aa" };
    String inString, startWkString;
    boolean accept1;
    CFG CFG1 = new CFG(C);
    if (args.length >= 1) {
      // Input string is command line parameter
      inString = args[0];
      char[] startNonTerm = new char[1];
      startNonTerm[0] = CFG1.getStartNT();
      startWkString = new String(startNonTerm);
      accept1 = CFG1.processData(inString, startWkString);
      System.out.println(" Accept String? " + accept1);
    }
  } // end main
} // end class


public class CFG {

  private String[] code;
  private char startNT;

  CFG(String[] c) {
    this.code = c;
    setStartNT(c[0].charAt(0));
  }

  void setStartNT(char startNT) {
    this.startNT = startNT;
  }

  char getStartNT() {
    return this.startNT;
  }

  boolean processData(String inString, String wkString) {
    if (inString.equals(wkString)) {
      return true;
    } else if (wkString.length() > inString.length()) {
      return false;
    }

    // search for non-terminal in the working string
    boolean containsNT = false;
    for (int i = 0; i < wkString.length(); i++) {
      // if one of the characters in the working string is a non-terminal
      if (Character.isUpperCase(wkString.charAt(i))) {
        // mark containsNT as true, and exit the for loop
        containsNT = true;
        break;
      }
    }
    // if there isn't a non-terminal in the working string
    if (containsNT == false) {
      return false;
    }

    // for each production rule
    for (int i = 0; i < this.code.length; i++) {
      // for each character on the RHS of the production rule
      for (int j = 0; j <= this.code[i].length() - 3; j++) {
        if (Character.isUpperCase(this.code[i].charAt(j))) {
          // make substitution for non-terminal, creating a new working string
          String newWk = wkString.replaceFirst(Character.toString(this.code[i].charAt(0)), this.code[i].substring(3));
          if (processData(inString, newWk) == true) {
            return true;
          }
        }

      }
    } // end for loop
    return false;
  } // end processData
} // end class
EN

回答 2

Stack Overflow用户

发布于 2021-06-29 22:08:24

您的语法包含一个左递归规则

代码语言:javascript
运行
AI代码解释
复制
U=>Ua

正如您刚刚发现的,递归下降解析器不能处理左递归。

您有两个选择:改变语法使其不再是左递归的,或者使用可以处理它的解析算法,比如LR1。在您的例子中,U匹配“至少两个a字符”,所以我们可以将递归向右移动。

代码语言:javascript
运行
AI代码解释
复制
U=>aU

一切都会好起来的。这并不总是能够以如此好的方式完成,但在您的例子中,避免左递归是一个简单的解决方案。

票数 0
EN

Stack Overflow用户

发布于 2021-07-03 06:48:17

你不需要这个for循环:"for (int j= 0;j <= this.codei.length() - 3;j++)“。jus创建一个var,在上面的非终结符搜索中保留大写字母。然后执行外部for循环,如果String[]中有以找到的非终结符开头的产生式规则,则执行替换和递归。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68185727

复制
相关文章
【计算理论】计算理论总结 ( 上下文无关文法 ) ★★
: 有限的规则组成的集合 , 规则规定如何进行代换操作 , 规定 变量 , 终端字符 , 字符串变量 等 ;
韩曙亮
2023/03/28
8300
【计算理论】计算理论总结 ( 上下文无关文法 ) ★★
上下文无关文法产生的语言都可以用正则文法来描述_c语言结构体默认值
正则表达式只能使用终结符(字母表中的字符),因而很容易变得复杂又难懂,实际中,经常使用正则描述,正则描述允许使用非终结符定义表达式,很像EBNF,但是它限制在未完全定义之前,不能使用非终结符,也就是说不允许递归或自嵌套。
全栈程序员站长
2022/11/01
1.1K0
【计算理论】计算理论总结 ( 上下文无关文法 CFG 转为下推自动机 PDA 示例 2 ) ★★
状态的指令都是从本状态指向本状态 , 生成两种指令 , 一种是基本指令 , 一种是终端字符指令 ;
韩曙亮
2023/03/28
8990
【计算理论】计算理论总结 ( 上下文无关文法 CFG 转为下推自动机 PDA 示例 2 ) ★★
【计算理论】计算理论总结 ( 上下文无关文法 CFG 转为下推自动机 PDA 示例 1 ) ★★
状态的指令都是从本状态指向本状态 , 生成两种指令 , 一种是基本指令 , 一种是终端字符指令 ;
韩曙亮
2023/03/28
9470
【计算理论】计算理论总结 ( 上下文无关文法 CFG 转为下推自动机 PDA 示例 1 ) ★★
【计算理论】计算理论总结 ( 上下文无关文法 | 乔姆斯基范式 | 乔姆斯基范式转化步骤 | 示例 ) ★★
② 语言不包含空字符串 : 如果上下文无关语法不包含空字符串时 , 一定 不需要
韩曙亮
2023/03/28
1K0
【计算理论】上下文无关语法 CFG ( CFG 设计示例 | CFG 歧义性 | Chomsky 范式 | 上下文无关语法 转为 Chomsky 范式 )
2 . 设计方法 : 非确定性优先自动机 ( NFA ) 识别某语言 , 将 NFA 转为 确定性优先自动机 ( DFA ) , 然后将 DFA 转为 上下文无关语法 ;
韩曙亮
2023/03/27
1.3K0
【计算理论】上下文无关语法 CFG ( CFG 设计示例 | CFG 歧义性 | Chomsky 范式 | 上下文无关语法 转为 Chomsky 范式 )
【计算理论】计算理论总结 ( 下推自动机计算过程 | 上下文无关文法 CFG 转为下推自动机 PDA ) ★★
1 . 下推自动机 ( PDA ) 提升了自动机计算能力 : 在上述自动机的基础上 , 提升该自动机的计算能力 , 引入一个新的栈结构 ;
韩曙亮
2023/03/28
8660
大学课程 | 编译原理知识点
令 X 为一个文法符号(一个终结符或非终结符)或 ε ,则集合 First (X) 由终结符组成,此外可能还有 ε ,它的定义如下:
Justlovesmile
2021/12/14
1.3K0
大学课程 | 编译原理知识点
懂前端的你也可以轻松定义自己业务的DSL
jison是一个 JavaScript 编写的解析器生成器,可以用来生成自定义的编程语言解析器。它的令人兴奋的点在于,它允许开发人员使用 JavaScript 语言来定义语法规则,然后将其转换为解析器,从而支持自定义的编程语言。
老码小张
2023/03/12
2.6K0
懂前端的你也可以轻松定义自己业务的DSL
P4:编写协议无关的包处理器
摘要 P4是一门编写协议无关的包处理器的高级语言。P4与SDN控制协议联合在一起工作,比如OpenFlow。在OpenFlow当前的协议形态中,它精确地指定了供它操作的协议头。这个协议头集合已经在短短的几年时间中,从12个域增长到了41个域,这同时也增加了协议的复杂性,但是仍然没有提供添加新的自定义首部的灵活性。 在这篇论文中我们将P4作为一个展示了OpenFlow在未来应该如何演进的草案协议而提出。我们有如下三个目标: 1.匹配域的重配置能力:在交换机被部署之后,开发者应该能够改变交换机处理数据包的方式
SDNLAB
2018/04/02
1.8K0
P4:编写协议无关的包处理器
从0开始自制解释器——添加对乘除法的支持
在上一篇中,我们实现了对减法的支持,并且介绍了语法图。针对简单的语法进行描述,用语法图描述当然是没问题的。但是针对一些复杂的语法进行描述,如果每个部分都通过语法图来描述就显得有些繁琐了。这篇我们先介绍另一种描述语法的方式,并进一步介绍一些关于语法分析的知识。
Masimaro
2023/03/24
5250
Chomsky文法类型判断
0型文法或短语结构文法的相应语言称为0型语言或短语结构语言L0。这种文法由于没有其他任何限制,因此0型文法也称为无限制文法,其相应的语言称为无限制性语言。任何0型语言都是递归可枚举的,故0型语言又称递归可枚举集。这种语言可由图灵机(Turning)来识别。
里克贝斯
2021/05/21
1.2K0
Chomsky文法类型判断
【计算理论】上下文无关语法 ( CFG ) 转为 下推自动机 ( PDA )
最终的 上下文无关语法 ( CFG ) 转为的 下推自动机 ( PDA ) 样式 :
韩曙亮
2023/03/27
7900
【计算理论】上下文无关语法 ( CFG ) 转为 下推自动机 ( PDA )
JAVA的平台无关性如何实现?
◆平台无关性                       ◆语言特性 ◆面向对象                           ◆类库 ◆GC                                    ◆异常处理
名字是乱打的
2022/05/13
4740
JAVA的平台无关性如何实现?
65.精读《手写 SQL 编译器 - 文法介绍》
我们将一块语法规则称为 产生式,使用 “Left → Right” 表示任意产生式,用 “Left => Right” 表示产生式的推导过程,比如对于产生式:
黄子毅
2022/03/14
5820
编译原理文法详解_编译原理为什么存在递归文法
学完了词法分析,我们知道词法分析器将正则表达式转换成词法单元流,但对于这个记号流我们不知道是否能由正确的文法产生,因此我们需要通过语法分析器来检测其合法性。语法分析器的输出是一棵语法分析树(无论显性还是隐性),并且进行一些语法纠错处理。语法分析的整个过程大概就是我们先定义一个语法,再用相应的算法来检测我们的词法单元流是否符合该语法。这里主要讨论上下文无关文法构成的语法和自顶向下、自底向上的语法分析。
全栈程序员站长
2022/11/17
8000
编译原理文法详解_编译原理为什么存在递归文法
用c语言手搓一个500+行的类c语言解释器: 给编程初学者的解释器教程(4)- 语法分析1
我们来看看两个概念,EBNF和递归下降文法,以及如何用这两个方法来计算tryC中的表达式。
云微
2020/06/05
1.8K0
用c语言手搓一个600行的类c语言解释器: 给编程初学者的解释器教程(4)- 语法分析1:EBNF和递归下降文法
用c语言手搓一个600行的类c语言解释器: 给编程初学者的解释器教程(1)- 目标和前言 用c语言手搓一个600行的类c语言解释器: 给编程初学者的解释器教程(2)- 简介和设计 用c语言手搓一个600行的类c语言解释器: 给编程初学者的解释器教程(3)- 词法分析 用c语言手搓一个600行的类c语言解释器: 给编程初学者的解释器教程(4)- 语法分析1:EBNF和递归下降文法 用c语言手搓一个600行的类c语言解释器: 给编程初学者的解释器教程(5)- 语法分析2: tryC的语法分析实现 用c语言手搓一个600行的类c语言解释器: 给编程初学者的解释器教程(6)- 语义分析:符号表和变量、函数
云微
2023/02/11
5640
【计算理论】上下文无关语法 ( 代数表达式 | 代数表达式示例 | 确定性有限自动机 DFA 转为 上下文无关语法 )
此时可以得到语法分析树 ; 该语法分析树是一个代数表达式 ; 将该语法分析树写出 , 即可理解 上下文无关 语法 ;
韩曙亮
2023/03/27
4780
【计算理论】上下文无关语法 ( 代数表达式 | 代数表达式示例 | 确定性有限自动机 DFA 转为 上下文无关语法 )
JavaScript 语言通识 — 重学 JavaScript
在这个重学系列的课程中,都会假设大家对 JavaScript、CSS、HTML 有了一定的了解。而这个重学的过程其实是帮助我们在这些过去的知识里面建立一个新的秩序,也就是建立知识体系的过程。在重学 JavaScript 的过程将会带着大家以 JavaScript 的语法为线索,从细到粗的跟大家完整学习一遍 JavaScript 的语言知识
三钻
2020/10/29
7000
JavaScript 语言通识 — 重学 JavaScript

相似问题

上下文无关文法

10

上下文无关文法

20

如何编写给定条件的上下文无关文法

10

上下文无关文法还是上下文敏感文法?

23

上下文无关文法转换

313
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档