我检查了关于枚举的C#语言规范部分,但无法解释以下代码的输出:
enum en {
a = 1, b = 1, c = 1,
d = 2, e = 2, f = 2,
g = 3, h = 3, i = 3,
j = 4, k = 4, l = 4
}
en[] list = new en[] {
en.a, en.b, en.c,
en.d, en.e, en.f,
en.g, en.h, en.i,
en.j, en.k, en.l
};
foreach (en ele in list) {
Console.WriteLine("{1}: {0}", (int)ele, ele);
}
Run Code Online (Sandbox Code Playgroud)
它输出:
c: 1
c: 1
c: 1
d: 2 …
Run Code Online (Sandbox Code Playgroud) 我正在尝试运行此命令:
git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch filename.js' --prune-empty --tag-name-filter cat -- --all
Run Code Online (Sandbox Code Playgroud)
但我一直收到这个错误:
fatal: ambiguous argument 'rm': unknown revision or path not in the working tree
.
Use '--' to separate paths from revisions, like this:
'git <command> [<revision>...] -- [<file>...]'
Run Code Online (Sandbox Code Playgroud) 也就是说,是否有一个工具可以自动显示给定语法的完整语言,包括突出显示歧义(如果有的话)?
这是一个带有一个int
参数的简单函数:
void f(int x) {}
f(42);
Run Code Online (Sandbox Code Playgroud)
这是另一个带有一个int
参数的函数:
void g(int(x)) {}
g(42);
Run Code Online (Sandbox Code Playgroud)
现在让我们定义x
一个类型:
typedef int x;
void h(int(x)) {}
h(42);
// warning: passing argument 1 of ‘h’ makes pointer from integer without a cast
Run Code Online (Sandbox Code Playgroud)
(这是我用gcc 4.8.2观察到的行为)
解析器编写者如何处理这种情况?
似乎经典的管道Lexer - > Parser - > Semantic Checker - > ......在这里不起作用.
我正在寻找专门用于处理歧义的算法或数据结构.
在我特定的当前感兴趣的领域,我正在研究对自然语言的模糊解析,但我认为在计算中必须有许多领域,其中模糊性起作用.
我可以找到很多关于试图避免模棱两可的内容,但很少关于如何接受歧义和分析模棱两可的数据.
假设解析器生成这些替代令牌流或解释:
A B1 C
A B2 C
A B3 B4 C
可以看出,流的某些部分在解释(A
... B
)之间共享,而其他部分则分支到其他解释中,并且经常与主流会合.
当然,可能会有更多的解释,替代方案的嵌套以及没有主流的解释.
这显然是某种带节点的图形.我不知道它是否有确定的名称.
是否存在我可以研究的现有算法或数据结构,旨在处理这种模糊的图形?
我正在解析一种没有像;
. 表达式被定义为最长的标记序列,因此5-5
必须解析为减法,而不是解析为两个语句(文字5
后跟一元否定-5
)。
我使用LALRPOP作为解析器生成器(尽管名称如此,但它是 LR(1) 而不是 LALR,据我所知)。LALRPOP 没有优先级属性,并且默认情况下不像 yacc 那样更喜欢移位而不是归约。我想我了解如何通过构建规则“链”在 LR 语法中编码常规运算符优先级,但我不知道如何将其应用于此问题。
\n预期的解析将是(括号中的各个语句):
\n"5 - 5" \xe2\x86\x92 5-5 instead of 5, -5\n"5 (- 5)" \xe2\x86\x92 5, -5\n"- 5" \xe2\x86\x92 -5\n"5 5" \xe2\x86\x92 5, 5\n
Run Code Online (Sandbox Code Playgroud)\n如何更改语法,使其始终更喜欢较长的解析?
\n浏览谷歌结果的前几页以及堆栈溢出并没有针对这个特定问题产生任何结果。大多数相关问题需要更多的前瞻,否则结果是不允许出现没有终止符的连续语句。
\n我创建了一个最小的示例语法来重现移位/归约冲突(该语法中的语句只是一个表达式,在完整的语法中还会有“if”、“while”等以及更多级别的运算符优先级,但是为了简洁起见,我省略了它们)。除了一元减号之外,原始语法中还存在其他冲突,例如print(5)
,可以将其解析为标识符print
和括号内的数字(5)
或函数调用。可能还会有更多这样的冲突,但它们都有相同的根本问题,即应该首选较长的序列,但两者目前都是有效的,尽管只有第一个应该有效。
为了方便起见,我创建了一个存储库(签出和cargo run
)。语法是:
"5 - 5" \xe2\x86\x92 5-5 instead of 5, -5\n"5 (- 5)" \xe2\x86\x92 5, -5\n"- …
Run Code Online (Sandbox Code Playgroud) 我们正在学习课堂上的歧义,并且给出了以下语法作为模糊语法的一个例子.我只是没有看到它是多么模糊.是否存在人们用来确定歧义的设定模式或方法,或者它就像一个逻辑谜题,你必须通过组合来找到语法中的歧义句子?我在网上看到的例子大多已经给出了含糊不清的句子,但是你怎么在第一时间找到这句话呢?我很感激任何帮助,谢谢.
< stmt_list> ==> < stmt>
| < stmt> ; < stmt_list>
< var> ==> A | B | C
< stmt> ==> < var> + < var>
| < var> - < var>
| < var>
Run Code Online (Sandbox Code Playgroud) 我需要匹配ANTLR
包含由 / 分隔的 2 个字段的消息,第一个字段可以有1..3
数字,第二个字段可以有1..2
数字,
这不起作用
msg: f1 '/' f2;
f1: DIGIT(DIGIT(DIGIT)?)? ;
f2: DIGIT(DIGIT)?
Run Code Online (Sandbox Code Playgroud)
ANTLR
?非常感谢克里斯
我正在看下面的语法,我相信它在第3行是不明确的,但不确定.
<SL> ? <S>
<SL> ? <SL> <S>
<S> ? i <B> <S> e <S>
<S> ? i <B> <S>
<S> ? x
<S> ? y
<B> ? 5
<B> ? 13
Run Code Online (Sandbox Code Playgroud)
我发现这个字符串xi13yi5xeyx
我相信生成两个不同的解析树,但我不确定我是否做错了.
有人可以验证我的发现吗?
考虑以下 Swift 表达式
println(Generic<Foo, Bar>(1))
Run Code Online (Sandbox Code Playgroud)
Normally, one would read this as a generic call to the constructor Generic<Foo, Bar>
with the arguments (1)
.
println( Generic<Foo,Bar>(1) )
Run Code Online (Sandbox Code Playgroud)
However, when re-arranging the tokens a bit, it could also represent two separate comparisons, for example if Generic
and Foo
were some poorly named numeric variables:
println(Generic < Foo, Bar > (1))
// or, with proper parenthesis
println((Generic < Foo), (Bar > 1))
Run Code Online (Sandbox Code Playgroud)
What we can observe here is that an expression with …