本文介绍了正则表达式
github.com/riscv/riscv-gcc
正则表达式
正则表达式是语法
正则语言是语义
正则表达式定义了一个正则语言,为集合
形如L(正则表达式)
eg.C语言标识符的正则表达式
1 | ^[a-zA-Z_](a-zA-Z\d)*$ |
^
和$
限定在一行中匹配
[a-zA-Z_]
表示以下划线或大小写字母开头
(a-zA-Z\d)*
表示开头跟着0个或多个字母或数字
eg.C语言单行注释
1 | \/\/. |
\/
匹配/
的字面值
.
匹配除了换行外的所有无需加
^
匹配开头
1 | int a = 0; //这里的注释并非从开头写的也有效 |
eg.C语言多行注释
1 | \/\*[\s\S]*?\*/\ |
\/\*\*\/
是多行注释的字面形式
[\s\S]*?
的作用是匹配任意字符
\s
表示空白字符(包括空格、制表符、换行符等)
\S
则表示非空白字符。
*
表示匹配一次或多次
?
用来尽可能减少匹配次数,遇到第一个*/
停止
eg.三的倍数
1 | (0|(1(01*0)*1))* |
Flex代码编写
1 | %{ |
手撸代码
要求
1 | // PL/0 demo |
预处理
实验要求:
1.合并空白符:把原始程序中相邻的空格、制表符、回车等空白符合并成一个空格,便于后续处理
2.消除注释:消除原始程序中的注释内容;PL/0语法中没有规定注释的格式,参照Pascal语言规定如下两种注释格式:
单行注释:“//”引导内容,与C++语言中单行注释一致。
多行注释:“(*”和“*)”之间内容,具体参见后面示例程序。
删除注释
代码如下
1 | void removeComments(char *source, char *destination) { |
合并空白符
代码如下:
1 | void mergeWhitespace(char *source, char *destination) { |
词法分析
输入输出
计划采取命令行和直接无参输入文件名两种方式,先写个架子,架子
1 |
|
数据类型定义
1 | // 定义单词种别的字符串表示数组 |
1.保留字提示改成关键字
2.最后为什么输出ERRO
3.以命令行参数的形式传入参数
4.各种输出显示仍然有点问题