标签: grammar

有歧义的正则语法?

这样的事情存在吗?如果是这样,你能提供一个例子吗?谢谢。

grammar computation-theory regular-language formal-languages

1
推荐指数
1
解决办法
2261
查看次数

C语言中非上下文无关语言的例子?

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

1
推荐指数
1
解决办法
2972
查看次数

检查语法歧义

以下是我试图查看是否有歧义的一段语法的摘录。

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}.

compiler-construction grammar parsing

1
推荐指数
1
解决办法
4306
查看次数

解决与 PLY 的 shift/reduce 冲突

我对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)

python compiler-construction grammar parsing ply

1
推荐指数
1
解决办法
3246
查看次数

一个^(2 ^ I)语言的语法的结构

我是那种一卡与自动机和语法问题.我搜索了很多但没有成功.

它甚至有可能构建一个语法生成这种语言L?

 L = { a(2i) | i >= 0} 

谁能为我提供简单的解决方案?

grammar context-free-grammar automaton exponential context-free-language

1
推荐指数
1
解决办法
325
查看次数

Bison 中是否需要语法左分解?

我正在使用野牛制作一个解析器。我只是想问在野牛中使用语法时是否仍然需要左因子。我尝试为 bison 提供非左因子语法,它没有给出任何警告或错误,并且它也接受了我提供给解析器的示例语法,但我担心解析器在每个输入中可能不准确。

grammar parsing bnf bison

1
推荐指数
1
解决办法
2233
查看次数

如何在 Antlr4 的解析树中检测空格?

当一个规则在 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)

我尝试获取标记的开始/停止索引,以便可以将文本长度与进入其中的字符数进行比较,但停止标记并不总是可用,如果是,则值不可用与我期望的索引对齐,并且访问形成令牌的原始输入字符似乎并不简单。

c++ grammar parsing antlr antlr4

1
推荐指数
1
解决办法
649
查看次数

NLP PROLOG 语法

我们有正式的语言

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)

grammar nlp prolog

1
推荐指数
1
解决办法
149
查看次数

Scala 语法规范与以分号结尾的一行表达式不匹配 if-else?

我正在学习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'. 我有这些问题:

  1. 当第一个;afterprintln(1)匹配semibefore else( [[semi] ‘else’ Expr]) 时,如何匹配'\n'after ;after的第二个println(1)
  2. 3号'\n'之后怎么匹配else
  3. 2号;和4号'\n'之后如何匹配println(2)?由于if-else不匹配任何;'\n'尾部。

compiler-construction syntax grammar scala

1
推荐指数
1
解决办法
788
查看次数

为什么 C 使用两个单引号来分隔字符文字而不是一个?

C 真的需要两个单引号(撇号)来分隔字符文字而不是一个?

对于字符串文字,我们确实需要分隔开头和结尾,因为字符串的长度不同,但在我看来,我们确实知道 char 文字的长度:单个字符(在源中),如果是两个字符是常规字符转义(前缀\0),如果是八进制文字(前缀\0[0-7]),则为五个字符,等等。

请记住,我正在寻找技术答案,而不是历史答案。它使解析更简单吗?它是否使 70 年代硬件上的解析更简单?它是否允许更好地解析错误消息?像这样的东西。

(大多数受 C 语法启发的语言可能会问同样的问题,因为它们中的大多数似乎使用相同的语法来分隔字符文字。我认为 Jai 编程语言可能是一个例外,因为我似乎记得它只使用了一个问题标记(在开始时),但我不确定。)

一些例子:

  • 'G'
  • '\0'
  • '\0723'

如果我们只在标记的开头使用单引号,它会起作用吗?

  • 'G
  • '\0
  • '\0723

原则上,我们能否在不使语法复杂化的情况下以相同的方式解析这些标记?

我们看到空字节文字和八进制文字具有相同的前缀,但可能没有任何歧义,因为可能没有任何方式'\0紧随其后723可能不是字符文字(至少在我看来)。如果存在歧义,则可以\z改为空字节文字。

是否需要两个单引号才能正确解析字符文字?

c grammar char

1
推荐指数
1
解决办法
100
查看次数