C 语言中有哪些非上下文无关语言的例子?C语言中如何存在以下非CFL?
a) L1 = {wcw|w 是 {a,b}*}
b) L2 = {a^nb^mc^nd^m| n,m >=1}
c grammar programming-languages context-free-grammar context-sensitive-grammar
以下是我试图查看是否有歧义的一段语法的摘录。
Y->b
Y->Z
Z->bW
W->d
W->?
Run Code Online (Sandbox Code Playgroud)
当我计算第一组语法时,我偶然发现了 Y 中第一个的不规则性。
First(Y) = {b,First(Z)}
First of Z = b so I have the set First(Y)={b,b}.
Run Code Online (Sandbox Code Playgroud)
我想知道的是,这足以证明给出这个证据的语法是否有歧义。或者应该设置为First(Y) = {b}
.
我对PLY 中的setlx 语言有以下语法:
Rule 0 S' -> file_input
Rule 1 file_input -> statement_list
Rule 2 epsilon -> <empty>
Rule 3 statement_list -> statement
Rule 4 statement_list -> statement_list statement
Rule 5 statement -> simple_statement SEMICOLON
Rule 6 statement -> compound_statement
Rule 7 simple_statement -> expression_statement
Rule 8 simple_statement -> assert_statement
Rule 9 simple_statement -> assignment_statement
Rule 10 simple_statement -> augmented_assign_statement
Rule 11 simple_statement -> backtrack_statement
Rule 12 simple_statement -> break_statement
Rule 13 simple_statement -> continue_statement
Rule 14 simple_statement …
Run Code Online (Sandbox Code Playgroud) 我是那种一卡与自动机和语法问题.我搜索了很多但没有成功.
它甚至有可能构建一个语法生成这种语言L?
L = { a(2i) | i >= 0}
谁能为我提供简单的解决方案?
grammar context-free-grammar automaton exponential context-free-language
我正在使用野牛制作一个解析器。我只是想问在野牛中使用语法时是否仍然需要左因子。我尝试为 bison 提供非左因子语法,它没有给出任何警告或错误,并且它也接受了我提供给解析器的示例语法,但我担心解析器在每个输入中可能不准确。
当一个规则在 antlr4 中匹配,并且您获得该规则的文本时,词法分析器通常会删除空格
WS: [ \n\t\r]+ -> skip;
Run Code Online (Sandbox Code Playgroud)
是否可以在解析树访问者中询问“此规则是否跳过了任何空格?”
例如
WS: [ \n\t\r]+ -> skip;
ALPHA: [a-z];
NUMERIC: [0-9];
myrule: (ALPHA | NUMERIC)+;
Run Code Online (Sandbox Code Playgroud)
然后在访问者中(我使用的是 C++):
antlrcpp::Any MyVisitor::visitMyrule(dlParser::MyruleContext *ctx) {
if (ctx->didSkipSomeWhitespace()) {
/* There was whitespace */
} else {
/* There was no whitespace */
}
return false;
}
Run Code Online (Sandbox Code Playgroud)
所以:
f56fhj => no whitespace
o9f g66ff o => whitespace
Run Code Online (Sandbox Code Playgroud)
我尝试获取标记的开始/停止索引,以便可以将文本长度与进入其中的字符数进行比较,但停止标记并不总是可用,如果是,则值不可用与我期望的索引对齐,并且访问形成令牌的原始输入字符似乎并不简单。
我们有正式的语言
G 1 = { V , T , S , P }, where
V = { S , E }
T = { x , y , z }
P = { S->E , E->xE , E->yE , E->z }
Run Code Online (Sandbox Code Playgroud)
我们可以接受七个句子 { xz , xy , xyz , xyxz , z , xxyz , Xyz } 作为格式良好的公式吗?使用 Prolog 验证这一点。
这是我的代码:
s --> e.
e --> [x], e.
e --> [y], e.
e --> [z].
Run Code Online (Sandbox Code Playgroud)
它只能识别 s([z], R)。为什么?
?- s([z], …
Run Code Online (Sandbox Code Playgroud) 我正在学习Scala 语法规范。
被if-else
语法弄糊涂了:
Expr1 ::= ‘if’ ‘(’ Expr ‘)’ {nl} Expr [[semi] ‘else’ Expr]
| ...
Run Code Online (Sandbox Code Playgroud)
它如何在 if-else 下方匹配以分号结尾的一行表达式?
if (true) // \n
println(1); //\n
else //\n
println(2); //\n
Run Code Online (Sandbox Code Playgroud)
请注意,有 4 行,每行后跟一个'\n'
. 我有这些问题:
;
afterprintln(1)
匹配semi
before else
( [[semi] ‘else’ Expr]
) 时,如何匹配'\n'
after ;
after的第二个println(1)
?'\n'
之后怎么匹配else
?;
和4号'\n'
之后如何匹配println(2)
?由于if-else
不匹配任何;
或'\n'
尾部。C 真的需要两个单引号(撇号)来分隔字符文字而不是一个?
对于字符串文字,我们确实需要分隔开头和结尾,因为字符串的长度不同,但在我看来,我们确实知道 char 文字的长度:单个字符(在源中),如果是两个字符是常规字符转义(前缀\0
),如果是八进制文字(前缀\0[0-7]
),则为五个字符,等等。
请记住,我正在寻找技术答案,而不是历史答案。它使解析更简单吗?它是否使 70 年代硬件上的解析更简单?它是否允许更好地解析错误消息?像这样的东西。
(大多数受 C 语法启发的语言可能会问同样的问题,因为它们中的大多数似乎使用相同的语法来分隔字符文字。我认为 Jai 编程语言可能是一个例外,因为我似乎记得它只使用了一个问题标记(在开始时),但我不确定。)
一些例子:
'G'
'\0'
'\0723'
如果我们只在标记的开头使用单引号,它会起作用吗?
'G
'\0
'\0723
原则上,我们能否在不使语法复杂化的情况下以相同的方式解析这些标记?
我们看到空字节文字和八进制文字具有相同的前缀,但可能没有任何歧义,因为可能没有任何方式'\0
紧随其后723
可能不是字符文字(至少在我看来)。如果存在歧义,则可以\z
改为空字节文字。
是否需要两个单引号才能正确解析字符文字?