- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想知道如何设计这种正则文法,或者如何将我的上下文无关文法转换为正则文法(如 A->aA)。我试过了,但没有结果。
问题:Σ ={a,b} 上的字符串集至少包含两次 aaa 和至少一次 bbbb.[aaaabbbb 计数]。语法要有规律。
我在CFG中的答案是A 将检查 'aaaa' 是否出现在单词中B 将检查 'bbb' 是否出现在单词中C 将检查 'aaa' 是否在单词中至少出现两次
S -> AB |学士 |加拿大广播公司 | build 银行 |密件抄送
A -> aaaa |一个|啊| BA |抗体
B -> bbb | AB |霸 | bB | Bb
C -> aaa | AC |钙 | BC | Cb
最佳答案
要想得到正则语法,可以先尝试写下一个DFA;将 DFA 转换为常规语法很简单。要获得 DFA,我们可以在此处使用笛卡尔积机构造。
从包含 aaaa 或 aaa 的两个实例的语言 L1 和包含 bbbb 的 L2 的 DFA 开始。这些的 DFA 很简单:
b a,b
/--+------+-------\ /--\
\ | | | \ |
\ V | | \ V
L1: q0--a-->q1--a-->q2--a-->q3--a-->q4
/ ^
/-+-----+---b---+----/ |
| | | |
V / | |
q5--a-->q6--------a------/
a a,b
/--+------+-------+-------\ /--\
\ | | | | \ |
\ V | | | \ V
L2: q0--b-->q1--b-->q2--b-->q3--b-->q4
Cartesian Product Machine 构造将为我们提供一个 35 状态的 DFA:第一个状态为 8 个状态,第二个状态为 5 个状态。我们将这些状态称为 q00、q01、...、q64。那么常规语法只是编写转换的一种不同方式。这是它最终的样子:
q00 -> aq10 | bq01
q01 -> aq10 | bq02
q02 -> aq10 | bq03
q03 -> aq10 | bq04
q04 -> aq14 | bq04
q10 -> aq20 | bq01
q11 -> aq20 | bq02
q12 -> aq20 | bq03
q13 -> aq20 | bq04
q14 -> aq24 | bq04
q20 -> aq30 | bq01
q21 -> aq30 | bq02
q22 -> aq30 | bq03
q23 -> aq30 | bq04
q24 -> aq34 | bq04
q30 -> aq40 | bq51
q31 -> aq40 | bq52
q32 -> aq40 | bq53
q33 -> aq40 | bq54
q34 -> aq44 | bq54
q40 -> aq40 | bq41
q41 -> aq40 | bq42
q42 -> aq40 | bq43
q43 -> aq40 | bq44
q44 -> aq44 | bq44
q50 -> aq60 | bq51
q51 -> aq60 | bq52
q52 -> aq60 | bq53
q53 -> aq60 | bq54
q54 -> aq64 | bq54
q60 -> aq30 | bq51
q61 -> aq30 | bq52
q62 -> aq30 | bq53
q63 -> aq30 | bq54
q64 -> aq34 | bq54
我们注意到一些非终结符从未出现在产生式的右侧。我们可以通过去掉这些来简化语法:
q00 -> aq10 | bq01
q01 -> aq10 | bq02
q02 -> aq10 | bq03
q03 -> aq10 | bq04
q04 -> aq14 | bq04
q10 -> aq20 | bq01
q14 -> aq24 | bq04
q20 -> aq30 | bq01
q24 -> aq34 | bq04
q30 -> aq40 | bq51
q34 -> aq44 | bq54
q40 -> aq40 | bq41
q41 -> aq40 | bq42
q42 -> aq40 | bq43
q43 -> aq40 | bq44
q44 -> aq44 | bq44
q50 -> aq60 | bq51
q51 -> aq60 | bq52
q52 -> aq60 | bq53
q53 -> aq60 | bq54
q54 -> aq64 | bq54
q60 -> aq30 | bq51
q64 -> aq34 | bq54
这应该会让您非常接近您想要去的地方。此时我们只需要添加一些产生式来编码 q44 是唯一接受状态的事实。您可以添加 q44 -> e
如果允许的话,或者只要你有q -> sq44
添加额外的形式 q -> s
.
关于context-free-grammar - 将上下文无关文法转换为常规文法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61531787/
我正在尝试实现一个表达式处理语法(处理嵌套括号和其他内容)。到目前为止我有以下内容,但它们无法处理某些情况(成功/失败情况出现在以下代码块之后)。有人知道这是怎么回事吗? 注意: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
我是一名优秀的程序员,十分优秀!