- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在尝试设计一种算法,将 CFG G 和终结符 a 作为输入,如果 S(G 的起始规则)可以生成以 a 开头的句子形式,则输出 yes。即,如果 (T U N)* 中有一个字符串 α 使得 S =>* aα ,否则它输出 no。例如,如果文法是 S -> [S] |党卫军 | ε,如果 a = ],答案是否定的。我不是在寻找代码,我只是想了解我应该如何在伪代码中处理这个主题。
最佳答案
X
可以通过三种方式导出以a
开头的字符串。
X -> a...
X -> A...
形式的规则,A
导出一个以 a
开头的字符串。X -> B A...
形式的规则,B
导出 ε
和 A...
导出一个以 a
开头的字符串。您可以使用这些来构建一个算法,该算法查看以 S -> ...
形式开始的所有语法规则,如果 rhs 以 a 开头,则应用检查 1如果它以非终端开头,则终端或两者都检查 2 和 3。每个检查都对应一个返回 bool 值的(可能是递归的)函数。
一个有趣的细节是需要处理语法中的循环,例如单个规则,例如 A -> A a
,还有 A -> B...
、B -> C...
、C -> A...
。如果您不小心,相互递归检查将无限重复。我会让你的。想一想深度优先搜索如何避免永远跟随图中的循环。
另一个细节是如何确定给定的非终结符 B 是否派生 ε
。您应该能够自己解决这个问题,但如果一切都失败了,请查找“可空非终端”。你会发现一个众所周知的小算法。
如果任何检查结果为正,则返回 yes。否则规则的详尽应用是没有办法的。返回编号。
关于上下文无关文法的算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36869624/
我正在尝试实现一个表达式处理语法(处理嵌套括号和其他内容)。到目前为止我有以下内容,但它们无法处理某些情况(成功/失败情况出现在以下代码块之后)。有人知道这是怎么回事吗? 注意:varname +=
我在 ANTLR 语法中写下了以下语句: loopStatement : 'loop' (statement|exit)* 'end' 'loop' ';' ; 如果我没理解错的话,
为 C 的一个子集编写一个简单的 BNF 语法,它支持多个语句,包括赋值、if-else 和没有 block 语句的 while 语句。为你的非终结符使用有意义的名字(相对于神秘的字母)。假设变量由单
我正在尝试为以下语法创建一个 LALR(1) 解析器并发现一些移位/归约冲突。 S := expr expr := lval | ID '[' expr ']' OF expr lval := ID
根据这个paper的规则: If A is the start nonterminal, put EOF in FOLLOW(A) Find the productions with A on the
为 k > 1 制作人工 LR(k) 文法很容易: Input: A1 B x Input: A2 B y (introduce reduce-reduce con
在使用 make 和 bison 的项目中,我很难指定编译语法 grammar.tab.c 依赖于语法输入 grammar.y,每个目标文件都依赖于相应的源文件(包括 grammar.tab.o),并
我正在尝试从语法分析树中提取乔姆斯基范式 (CNF) - 句子的语法产生式: (ROOT (S (NP (DT the) (NNS kids)) (VP (VBD opened)
我知道 ANTLR 可以接受 LL(*) 文法。但是,有没有办法使用 ANTLR 检查语法是否是 LL(1)? 最佳答案 options { k = 1; } 如果您的语法不在 LL(1) 中,
我还没有找到答案。是否存在无法转换为 LL(1) 的上下文无关且无歧义的语法? 我发现了一个我不知道如何转换为 LL(1) 的作品:parameter-type-list C99中的生产: param
我是一名优秀的程序员,十分优秀!