词素编译
㈠ 计算机编程语言的发展过程
简单一点可以是:机器语言-汇编语言-高级语言……
㈡ C语言const char和char有什么区别,指针变量date有点懵,请帮我讲解一下
有一个判断 C 语言的声明式的技巧,那就是“从右往左读”,C++ 创始人 Bjarne Stroustrup 在其着作《The C++ Programming Language》中推荐了这种方法,《C 专家编程》中也提及了这种技巧。相比于其他的“根据 const 与其他词素的距离判断”、“根据 const 的前后关系判断”等等,个人认为这是最人性化的方法。从某种意义上来说,C 编译器在进行词法分析的时候巧合地运用了这种范式来进行语义转换,这一点在 Backus(上下文无关法) 范式中也有体现。
具体的方法是:
const char * A:A 是一个指针,指向 const char。
char const * A:A 是一个指针,指向 const char。
char * const A:A 是一个 const 指针,指向 char。
const char * const A:A 是一个 const 指针,指向 const char。
const char const * const A:A 是一个 const 指针,指向 const char,后面两个(从右往左读)有一个是多余的。
看到给出的示例:
const char* date;
这是一个指向 const char 的指针,这说明指针本身可变,但是其指向的 char 是不可变的,而 date = "new string" 中常量字符串其实是一个指针,因为指针可变,所以这里没问题。
但是如果写成 char* const date,那么这就是一个不可变的指针,但是其指向的 char 是可变的,这时候写 date = "new string" 就会报错:
error: cannot assign to variable 'date' with const-qualified type 'char *const'
但是如果尝试如下语句:
char* const date = "Hello, world!";
date[0] = 'H';
编译能通过,但是运行时会出错:
zsh: bus error
总线错误是怎么引起的呢?不是指向的 char 可变吗?对,指向的 char 可变,所以编译能通过,但是赋给 date 的是一个字面字符串,按照 C 语言操作内存的机制,尝试更改字面字符串的会引起 bus error,至于具体的原因,可以继续深入了解 C 语言的编译机制和运行原理,这里不再赘述。
㈢ 编译原理中的词法分析器的输入与输出是什么
编译原理中的词法分析器的输入是源程序,输出是识别的记号流。
词法分析器编制一个读单词的程序,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符和分隔符五大类。并依次输出各个单词的内部编码及单词符号自身值。(遇到错误时可显示“Error”,然后跳过错误部分继续显示)。

(3)词素编译扩展阅读
词法分析器的作用:
1、与符号表进行交互,存储和读取符号表中的标识符的信息。
2、读入源程序的输入字符,将他们组成词素,生成并输出一个词法单元序列,每个词法单元序列对应一个于一个词素。
3、过滤掉程序中的注释和空白。
4、将编译器生成的错误消息与源程序的位置联系起。
