在我目前的项目中,我已经用Xtext编写了语法,具有很好的功能。例如,我的语法代码片段
Device:
deviceName = ID ':'
('region' ':' ( deviceRegions += DeviceRegions)+ )* ;
DeviceRegions:
regionLabel = [RegionLabel] ';'
// It stores a List of regionLabel functionalities
;
RegionLabel: na
我使用的是Go 1.7.4。有没有什么方法可以验证字符串是否遵循特定的模板。例如,这里是我的字符串(请忽略,如果是,那么这些将被视为字符串的一部分)
IF NAME: A> B> C
AND AS: 10796
OR DIVISION: X> Y> Z
AND IP : 107.211.11.0/22
OR IP PREFIX: 66.144.0.0/16
THEN
#1: PASS(60%), FAIL(40%)
#2: PASS(40%), FAIL(35%), DISTINCTION(25%)
元素将是相同的,但出现的次数可以
我想使用扩展的(EBNF)上下文无关语法来定义一组无序的值。在EBNF中很容易定义一个无序的值列表,例如:
value = 'A' | 'B' | 'C';
list = value, {',', value};
然而,我怀疑它是否可以做一个无序的集合。
以下是有效的无序值集的示例:
A, B, C, D
A, B, D, C
A, D, C, B
...
D, C, B, A
虽然无效的名单是:
A, A, C, D
B, C, C, B
A, A, A, A
...
或者任意长度的列表。
A, A, B, C, D, A
A,
我在过去的一份试卷中给出了以下问题。我理解解决方案(某种程度上?)但是想知道是否有人知道解决方案是如何实际生成的(或者是其他更简单的解决方案)。
给出一个形式文法G,它满足L(G) =L…
L := {w member of {a,b}* | n does not exist in N : w = (ab)^n}
答案是:
G : ({A,B,S},{a,b},P,S) with
P := {
S-> a | empty | bA | aB | aaA
A-> aA| bA | empty
B-> aB | bB | a | aaA
我正在读先生写的一章。。他的材料对我很有用,也很清楚。但在它之前我读了标准..。我看到EBNF的符号和语法由mr。理查德·E·帕蒂斯( Richard E. Pattis )在标准中不一样。我不明白为什么.
例如,standard写道:
a)引用语言的结束符号,以便任何字符,包括在扩展BNF中使用的字符,都可以定义为所定义语言的终端符号。
但是..。Pattis在自己的样本中不使用引号。此外,他还使用不方便的方式将非终端符号写入终端符号:例如,他放入框中的|字符(看起来就像MS中字符周围的边框)。通常的文本编辑器做不到。因此这种方式是不方便的。
此外,standard还写道:
( d
假设我们有一个上下文无关文法,如果它是在LL1中,那么它只有右联想!但是假设我想让上下文无关文法有左结合,那么它就不会停留在LL1中(这没问题),我想为了让上下文无关文法有左结合,我应该让它有左递归。有没有一种方法可以在不改变语法语言的情况下将左递归包含到上下文无关的语法中?例如,如果我们有这个上下文无关文法:
1: S -> sum ( ELIST )
2: ELIST -> E , ELIST
3: ELIST -> E
4: E -> num
5: E -> id
6: E -> S
如何让它包含一个左递归,这样运算符",“现在就是左关联的?
我需要帮助证明上下文无关文法A和常规语言B之间的集合差异是上下文无关语言。
我试着用这样的例子来证明:
设A= {a^n b^n |n >= 1}
设B= {w {a,b}* |w至少有三个a}
则A-B应为{a^n b^n |1 <= n<3 },例如。(ab,aabb)
如果A-B是一种上下文无关语言,那么一定存在某种上下文无关文法G来表示它。
G= ({S},{a,b},P,S)
S->aAb | ab
A->ab
G是上下文无关的,因为它可以用标准的乔姆斯基形式重写:
S -> BD | BC
D -> AC
A -> BC
B ->
语法从定义上包含了非常简单的语法的例子:
E -> E + E
E -> n
我想在c#中实现语法类,但是我不知道如何存储产品,例如如何区分终端符号和非终端符号。我在想:
struct Production
{
String Left; // for example E
String Right; // for example +
}
左总是非终端符号(它是上下文无关的语法),但是生产的右侧可以包含终端和非终端符号。
现在我想到了两种实现方法:
非终端符号将使用括号编写,例如:
E+E将表示为字符串“E+E”创建附加数据结构NonTerminal。
我有一些关于扩展BNF的问题。
(* Extended BNF grammar *)
min = 5;
max = 10;
value = integer; (* How can I set the range rule: `min <= value <= max`? *)
第二个问题:
name = letter, { letter | decimal digit };
(* The common length of the comment line must be not more than 128 characters.
But I don't know the n
我有一条BNF规则: <S> -> <A> b | <A> b <C>
<A> -> a | a <A>
<C> -> c | <C> c 我想把它变成EBNF规则,但是我对<A> and <C>中的左递归和右递归感到困惑,它在EBNF中有什么不同,还是它们是一样的? 下面是我所做的: To convert: <S> -> <A> b | <A> b <C> to EBNF
1. <S&