一、文法的种类
1.1 分类定义
Chomsky 文法定义:
- $G = (V, V_t, P, Z)$
- $V$:符号集合
- $V_t$:终结符号集合
- $P$ :有穷规则集合
- $Z$:是被符号,不能是终结符
关于不同文法的区别
是没有办法使用 C 风格的 IO 去输入和输出字符串的,也就是说,下面的程序是会发生段错误的。
#include <bits/stdc++.h>
using namespace std;
int main()
{
string s;
scanf("%s", s);
printf("%s", s);
return 0;
}
如果想要进行正确的 IO,需要利用 cin, cout
,如下所示
#include <bits/stdc++.h>
using namespace std;
int main()
{
string s1, s2, s3, s4;
cin >> s1;
// cin.getline(s2, 20);
// cin.get(s3, 20);
getline(cin, s4);
cout << s1 << endl;
// cout << s2 << endl;
// cout << s3 << endl;
cout << s4 << endl;
return 0;
}
在编译课中我们学过,符号是编译中的重点,我们必须确保我们的每个符号都是“指向它应当指的地方”。但是在实际工程中,符号分散在多个文件中,可能会出现“符号相同”和“符号查找不到”两种经典的情况,所以每门语言都在尽力解决多个符号的问题,python 也不例外。
一般解决这种问题,都是通过一种加 namespace 的方式解决的,当我们有两个 name
的时候,可以考虑给他们分别一个 namespaceA.name
和 namespaceB.name
去进行区分。namespace 是一个很自然的事情,尤其是一个大工程,可以认为 namespace
本来就是一种很自然的嵌套的结构(尤其是与文件和目录结合在一起的时候),比如说“编译器的错误检测部分的错误类型中的未定义符号错误”,就是 compiler.check.ErrorType.UNDEFINE_SYMBOL
。我们在实际使用的时候,其实是不是担心我们没法把相同的符号区分开,而是担心“没法用较短的字符串表示我们想要的符号”,毕竟不是每个人都愿意在工程的任何一个地方,使用 compiler.check.ErrorType.UNDEFINE_SYMBOL
来描述一个枚举常量。我们更喜欢只用 UNDEFINE_SYMBOL
去表示。