如何识别语法是LL(1),LR(0)还是SLR(1)?
任何人都可以使用此示例或任何其他示例来解释它吗?
X→Yz | 一个
Y→bZ | ε
Z→ε
我几个月前在D新闻组上发布了这个,但由于某种原因,答案从未真正说服过我,所以我想我会在这里问.
但是,C++的语法不是(即使没有宏).(请仔细阅读!)
现在被授予,我对编译器,词法分析器和解析器一无所知(正式).我所知道的只是我在网上学到的东西.
以下是(我相信)我对上下文的理解,在非技术术语中:
语言的语法是无上下文的,当且仅当你能够总是理解给定代码片段的含义(尽管不一定是确切的行为)而不需要在任何其他地方"看".
或者,更严格:
如果我需要,语法不能无上下文我只是通过查看它就无法告诉表达式的类型.
因此,例如,C++失败上下文测试,因为意义的confusing<sizeof(x)>::q < 3 > (2) 依赖于值的q.
到现在为止还挺好.
现在我的问题是:可以对D说同样的话吗?
例如,在D中,可以通过Value[Key]声明创建哈希表
int[string] peoplesAges; // Maps names to ages
Run Code Online (Sandbox Code Playgroud)
静态数组可以用类似的语法定义:
int[3] ages; // Array of 3 elements
Run Code Online (Sandbox Code Playgroud)
模板可以用来使它们混淆:
template Test1(T...)
{
alias int[T[0]] Test;
}
template Test2(U...)
{
alias int[U] Test2; // LGTM
}
Test1!(5) foo;
Test1!(int) bar;
Test2!(int) baz; // Guess what? It's …Run Code Online (Sandbox Code Playgroud) 对于一些主要的解析算法(LL(1),LR(1),LR(0),LALR(1)),是否有一个很好的在线资源和一组语法?我发现许多单独的语法属于这些家庭,但我知道没有好的资源,有人编写了大量的示例语法.
有谁知道这样的资源?
我的意思是,是否有编码语言与人类风格编码?例如:
Create an object called MyVar and initialize it to 10;
Take MyVar and call MyMethod() with parameters. . .
Run Code Online (Sandbox Code Playgroud)
我知道它不是那么有用,但创建这样的语法会很有趣.
今天在我们的代码库中注意到一行,我认为肯定会因为语法错误而无法构建,但是测试正在通过,所以显然它实际上是有效的python(在2.x和3中).
条件表达式有时不需要空格:
>>> 1if True else 0
1
Run Code Online (Sandbox Code Playgroud)
如果LHS是变量,它不起作用:
>>> x = 1
>>> xif True else 0
File "<stdin>", line 1
xif True else 0
^
SyntaxError: invalid syntax
Run Code Online (Sandbox Code Playgroud)
但它似乎仍然适用于其他类型的文字:
>>> {'hello'}if False else 'potato'
'potato'
Run Code Online (Sandbox Code Playgroud)
这里发生了什么,它是出于某种原因故意成为语法的一部分吗?这个奇怪的怪癖是一种已知/记录的行为吗?
我不是在谈论类似XHTML的代码.我正在谈论像这个疯狂的标记,这是完全有效的HTML(!)
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html<head>
<title//
<p ltr<span id=p></span</p>
</>
Run Code Online (Sandbox Code Playgroud)
因此,鉴于SGML注入的巨大复杂性,HTML是一种无上下文的语言吗?这是一种正式的语言吗?用语法?
HTML5怎么样?
我是正式语言概念的新手,所以请耐心等待.是的,我已阅读维基百科的文章;)
如何判断一个句子在Python中是否有效?
例子:
I love Stackoverflow - Correct
I Stackoverflow love - Incorrect
Run Code Online (Sandbox Code Playgroud) 我有一个名为的班级Identity.在我的javadoc评论中,我将其称为复数形式.我可以想到两个解决方案:更改<code>Identities</code>或<code>Identity</code>s 的引用.这些都不正确,我想知道是否有更好的解决方案.
这是一个清晰的例子:
/**
* Returns an <code>IdentityBank</code> of <code>Identity</code>s with the given sex.
*/
Run Code Online (Sandbox Code Playgroud)
要么
/**
* Returns an <code>IdentityBank</code> of <code>Identities</code> with the given sex.
*/
Run Code Online (Sandbox Code Playgroud) 有人可以向我解释为什么这种语法[无上下文语法和上下文敏感语法]接受一个字符串?
我所知道的是
无上下文语法是一种形式语法,其中每个生成(重写)规则是V→w的形式,其中V是单个非终结符号,w是一串终端和/或非终端.w可以是空的
上下文敏感语法是一种形式语法,其中任何生成(重写)规则的左侧和右侧可以被终端和非终结符号的上下文包围.
但是,我怎么能解释为什么这些语法接受一个字符串?
algorithm grammar parsing context-free-grammar context-sensitive-grammar