Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何编写上下文无关文法?

如何编写上下文无关文法?
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

复制
相关文章
三元运算符
var b = 5; alert((b == 5) ? a = "true" : a = "false"); 答案:true //判断一个整数是奇数还是偶数 var a, b; a = window.
闻语博客
2021/01/21
1K0
三元运算符
三元运算符在Python中通常被称为条件表达式。 这些运算符根据条件是否正确来评估某些事情。
Helloted
2022/06/06
8450
三元运算符
var b = 5; alert((b == 5) ? a = "true" : a = "false"); 答案:true //判断一个整数是奇数还是偶数 var a, b; a = window.
小语雀网
2022/05/06
5810
三元运算符
特殊说明:以上文章,均是我实际操作,写出来的笔记资料,不会盗用别人文章!烦请各位,请勿直接盗用!转载记得标注来源!
收心
2022/01/19
5790
JAVA三元运算符_java中三元运算符详解
三元运算符是if else或者if else if else的简写形式,可以使代码看起来简洁些。
全栈程序员站长
2022/09/27
6130
python三元运算符
转载于:https://www.cnblogs.com/shengguorui/p/11149593.html
用户7886150
2021/01/22
1.2K0
PHP三元运算符
PHP5.3.0 更新公告 : https://www.php.net/releases/5_3_0.php
很酷的站长
2023/02/03
9140
三元运算符用法_三元运算符判断三个值
大家好,又见面了,我是你们的朋友全栈君。 一、三元运算符 条件运算符 (?:) 也称为三元条件运算符,用于计算布尔表达式,并根据布尔表达式的计算结果为 true 还是 false 来返回(使
全栈程序员站长
2022/09/27
7490
JavaScript条件运算三元运算符和四元运算符的写法
exprIfTrue 如果表达式 condition 的计算结果是 truthy(它和 true 相等或者可以转换成 true ),那么表达式 exprIfTrue 将会被求值。
德顺
2020/04/01
2.1K0
JavaScript语法-逻辑运算符、三元运算符
JavaScript语法-逻辑运算符 && || !其他类型转换Boolean:1、number:0或NaN为假,其他为真2、string:除了空为字符串(" "),其他都是true3、null&undefined:都是false4、对象:所有对象都为true代码案例:<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>逻辑运算符</title> <script> var flag = tru
用户9392460
2022/11/17
6400
<Javascript>浅谈js“三元表达式” (三元运算符)
各位大神,大家好,相约周三。我们又见面了。 众所周知,三元表达式在代码量上比if…else语句更简洁一些。但是博主在可读性上更加偏向于if…else语句。三元表达式不仅在js中使用,在很多后台程序语言,比如java、php中都有使用,不过在js中对于三元表达式的要求貌似要松很多。废话不多说。下面一起看看三元表达式。
全栈程序员站长
2022/09/14
3.3K0
<Javascript>浅谈js“三元表达式” (三元运算符)
java之三元运算符
逻辑运算 ? m : n;如果逻辑运算为真,则返回m,否则返回n 实例: 判断i,j两个数的大小,如果a较大,则输出1,否则输出0; 找到i,j,k三个数中的最大值; public class Tes
西西嘛呦
2020/08/26
7140
PHP的三元运算符
三元运算符语法:条件 ? 结果1 : 结果2 说明:问号前面的位置是判断的条件,如果满足条件时结果1,不满足时结果2。 记性太差先记录下方便日后看 $if_summary = $row['IF_SUM
用户8099761
2023/05/11
1.7K0
java之三元运算符
需要三个数据才可以进行操作的运算符 格式:数据类型 变量名=条件?表达式A:表达式B 判断条件是否成立,成立为true,表达式A的值赋给左侧的变量;判断条件不成立为false,将表达式B的值赋给左侧的变量。
IT工作者
2022/02/11
6520
Java之三元运算符
文章目录 三元运算符 1. 基本语法 2. 案例演示 TernaryOperator.java 3. 三元运算符使用细节 4. 课堂练习 三元运算符 1. 基本语法 条件表达式 ? 表达式 1: 表达
兮动人
2021/06/11
1.2K0
Java之三元运算符
v-show使用三元运算符
这里是使用了element-ui <template slot-scope="scope"> <el-button type="primary" plain v-show="scope.row
江一铭
2022/06/17
5810
python中的三元运算符
三元运算符 a if test else b 如果test为真则返回a,否则返回b x = x+1 if x%2==1 else x 实现斐波那契序列 def fn(n): return n if n < 2 else fn(n-1)+fn(n-2)
Tim在路上
2020/08/05
1.1K0
Java中的三元运算符
讲三元运算符之前,我们先讲一讲双目运算符,比如我们常用 “=” 赋值运算符,就是一个双目运算符。它的格式如下:
Gorit
2021/12/09
9760
java三元运算符怎么用_按位运算符
大家好,又见面了,我是你们的朋友全栈君。 Java提供了一个三元运算符,可以同时操作3个表达式。三元运算符语法格式如下: 判断条件? 表达式1 :表达式2 在上述语法格式中,当判断条件成立
全栈程序员站长
2022/11/01
6690
vue 三元运算讲解
如果第一个条件为真,则引用第一个值classA;否则引用第二个值classB;通过切换显示不同的样式
侠客冷展堂
2022/01/07
1.9K0
vue 三元运算讲解

相似问题

三元运算符和赋值运算符

20

三元运算符和html

10

Props和三元运算符

220

三元(条件)运算符和样式

40

三元运算符和宏#定义

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

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

洞察 腾讯核心技术

剖析业界实践案例

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