首页 文章 精选 留言 我的

精选列表

搜索[零点击],共10000篇文章
优秀的个人博客,低调大师

从“零”开始设计中文编程语言——SQL领域演示

通过逐步完善一个简单的中文编程语言语法并最后转换为 SQL 语句,演示一种快速搭建中文编程语言原型的方法。 达成效果是,如下的中文语句: 创建读者表,编号为整数,出生年为文本 转换生成 SQL 语句: CREATE TABLE 读者 ( 编号 INTEGER, 出生年 TEXT ) 文中代码在 Python 3.8 下运行通过,需安装 RPly 木兰定制版 0.8.0。 一、中文标识符 首先来识别一个标识符——“读者”。下面是完整代码。 from rply import 分词器母机, 语法分析器母机 分词母机 = 分词器母机() 分词母机.添了('标识符', r'读者') 分析器母机 = 语法分析器母机(['标识符']) @分析器母机.语法规则("句 : 标识符") def 句(片段): return 片段[0].getstr() # 第一个片段的内容 分词器 = 分词母机.产出() 分析器 = 分析器母机.产出() print(分析器.按语法分词(分词器.分词('读者'))) 运行此源码文件可见输出。 先简单看下源码,分词母机添加的一条词法规则:标识符可以是“读者”。分析器母机添加的一条语法规则:句子只包含一个标识符,而且解析后直接输出它的内容(在 “句(片段)”方法中返回)。 最后对“读者”这一字符串进行按语法分词,输出的就是“读者”。(输出还有一句“回退次数:0”,请暂时无视) 当然,标识符不止有“读者”,于是将词法改为如下正则表达式,允许多个中文字符: 分词母机.添了('标识符', r'[\u4e00-\u9fa5]+') 这样,即使末句改为“观众”,也可被识别。 二、创建读者表 从创建表格开始设计语法,添加些关键词。先来一个“表”,希望能解析“读者表”后输出表名“读者”。 添加对应词法规则: 分词母机.添了('表', '表') 记得将它加到语法分析母机的词表中(注:此文后面的部分不再复述此代码,忘加的话就会碰到 “KeyError: '表'” 这种报错): 分析器母机 = 语法分析器母机(['表', '标识符']) 接着把语法规则改为: @分析器母机.语法规则("句 : 标识符 表") 好了,现在对“读者表”进行解析,即末句改为: print(分析器.按语法分词(分词器.分词('读者表'))) 如期输出了“读者”。 同理添加“创建”,希望解析“创建读者表”后暂仍输出“读者”。照样添加词法规则(注:此文之后部分不再复述此代码): 分词母机.添了('创建', '创建') 改语法规则: 句 : 创建 标识符 表 好,现在解析“创建读者表”,但为何输出“创建”了呢? 细看一下这段: @分析器母机.语法规则("句 : 创建 标识符 表") def 句(片段): return 片段[0].getstr() 修改语法规则后,现在一“句”中有三个片段,“片段[0]”现在对应的是“创建”,标识符应该是第二个片段,即“片段[1]”。修改之后,解析“创建读者表”就如期输出“读者”。 三、单列 创建表格时,可以对列进行声明,比如:“创建读者表,出生年为整数”。先支持一列。 添加“为”、“整数”两个关键词,并添加中文逗号: 分词母机.添了('逗号', ',') 语法呢?“创建读者表,出生年为整数”的第一部分是表声明,后面是逗号,以及列声明。那么就加这条语法规则: 建表 : 表声明 逗号 列声明 表声明的规则与之前相同: 表声明 : 创建 标识符 表 列声明的语法就是: 列声明 : 标识符 为 整数 与表声明类似,“片段[0].getstr()”就可从列声明中获得列名。 需注意的是,在建表方法中,片段[0] 取得的是表声明的输出值,即标识符名,这里不需再用 getstr()。另可用格式化字符串简化代码如下: def 建表(片段): return f"{片段[0]}:{片段[2]}" 解析“创建读者表,出生年为整数”后输出:“读者:出生年” 四、多列 表格当然可以有多列。比如:“创建读者表,编号为整数,出生年为整数”。 原本在表声明后的单一列声明,现在变为了对各列的声明: 建表 : 表声明 逗号 各列声明 如何描述各列声明的语法规则呢?分情况来看,如果只包含一个列声明,就这样: 各列声明 : 列声明 如果包含更多呢?可以这样描述,在一个“各列声明”后面再加上逗号和一个“列声明”,有点递归的意思: 各列声明 : 各列声明 逗号 列声明 那么如何区分处理这两种情况?看这段,各列声明的两种规则放在一起,用一个方法处理: @分析器母机.语法规则("各列声明 : 列声明") @分析器母机.语法规则("各列声明 : 各列声明 逗号 列声明") def 各列声明(片段): return f"{片段[0]}" if len(片段) == 1 else f"{片段[0]},{片段[2]}" 这里通过判断片段的个数来区分,还有其他方法比如判断某词的类型。 至此解析“创建读者表,编号为整数,出生年为整数”后输出:“读者:编号,出生年” 五、多种数据类型 除了整数,还可以有其他的列类型,比如文本。这也方便,与“整数”类似,添加“文本”一词后,添加如下语法: 列类型 : 整数 | 文本 这与上面的“各列声明”分两行效果相同,是同一语法元素的多种并列规则。 再把原本的列声明改为: 列声明 : 标识符 为 列类型 列声明的输出加上列类型后,解析“创建读者表,编号为整数,出生年为文本”后输出:“读者:编号-整数,出生年-文本” 六、转换为SQL 至此,各语法元素看起来解析无误,那么各语法规则已定,这部分仅对处理方法的返回值作了修改。 举几个例子,列类型应该返回 INTEGER 或者 TEXT: return "INTEGER" if 片段[0].getstr()=="整数" else "TEXT" 表声明部分: return f"CREATE TABLE {片段[1].getstr()}" 建表时将各列声明置于 () 中: return f"{片段[0]} ( {片段[2]} )" 另几处就请自行尝试吧。 完整源码 此文的完整代码约四十行,开源在此。如想继续完善创建表、记录以及其他查询、删除等语法,此测试用例 供参考。如有任何问题欢迎在源码库反馈。 注:本文中语言的设计是在搭建原型之前就有了草稿,见 此楼。此设计尚未经过实践检验,欢迎指摘。

优秀的个人博客,低调大师

Linux零碎笔记, 及一些命令

001.gui与tui gui, 完全的图形界面. tui, 终端下的图形界面. 002.补全命令 输入前缀, 按一次Tab. 若前缀不唯一, 按2次Tab, 出现相关命令列表. 003.RHEL7.2实现上网功能 1.固定的可用联网IP地址 2.关闭防火墙 3.关闭selinux 4.光盘自动挂载 5.配置好本地yum源 004.linux系统安装分区(标准分区) 1.boot分区:引导分区(启动系统用的), grub(引导器), 内核文件 200M 2.swap分区:内存扩展分区, 一般最多8G或16G 1000M 3./ 根:所有文件的根 10G 4.sda:linux下的第一个磁盘 5.RHEL7使用xfs文件系统, RHEL6使用ext4文件系统, Win7/10使用NTFS文件系统 005.手动配置以太网_IPv4设置 1.ip地址:192.168.0.71(网段192.168一样, 且是没用过的ip) 2.子网掩码:24 3.网关:192.168.0.1 4.DNS服务器:8.8.8.8(或114.114.114.114) 006.ubuntu第一次切换到root用户失败 1.为root设置一个root密码 sudo passwd root // 之后会提示要输入root用户的密码, 连续输入root密码 2.使用 su,并按照提示输入root密码, 就可以在终端中切换成超级管理员用户身份了! 3.设置后,以后就可以直接root登录了 007.ubuntu安装yum 1.安装了build-essential: apt-get install build-essential 2.安装yum: apt-get install yum 008.Xshell由于权限问题无法上传文件到linux 给lunux的文件夹设置权限, 例: 给/usr下的java文件夹添加上传权限 chmod -R 777 /usr/java // -R表示包括子文件夹 添加权限后,在/usr目录下输入: ll // 显示/usr/java这一个文件夹drwxrwxrwx(之前为drwxr-xr-x),并且有绿色阴影 Ubuntu chmod 命令可以用来修改文件或文件夹的读写权限, 命令有两种使用方式: (1)chmod [ u / g / o / a ] [ + / - / = ] [ r / w / x ] file, 其中: u表示User, 是文件的所有者 g表示跟User同Group的用户 o表示Other, 即其他用户 a表示ALL, 所有用户 +表示增加权限 -表示取消权限 =表示取消之前的权限, 并给予唯一的权限 r表示Read, 即读文件 w表示Write, 即写文件 x表示运行文件 file表示文件的路径, 如ubandy-rest/job/views.py For example: chmod u+rw ubandy-rest/job/views.py 2)chmod [xyz] file 其中, x, y, z分别表示数字(最大不超过7), 并分别对应User、Group、Other x, y, z的值由r(r=4), w ( w=2 ), x ( x=1 )来确定 For example:chmod 765 ubandy-rest/authentication/models.py 当然, 你也可以使用通配符 ‘*’, 来设置当前路径下的所有文件的权限 For example: 假如, 当前你的路径下有文件:1.txt, 2.html, 3.py 使用命令:chmod 777 * 可以同时设置上述三个文件的权限为rwx 如果你要修改整个文件夹的权限, 比如你有一个文件夹WhoJoy, 你想修改这个文件夹(包括内部的所有文件)的权限, 那么 可以使用命令:chmod -R 777 WhoJoy/ 其中:-R表示以递归整个文件夹中的子文件 009.ubuntu中apt命令是什么的缩写 the Advanced Packaging Tool 010.Xshell命令行的锁定/解除 Ctrl + q 011.Xshell无法连接到虚拟机,可能原因 1.防火墙未打开22端口 2.未安装openssh-server 3.虚拟机无法联网 012.ubuntu标准磁盘分区:21.5GB primary /boot 2.0GB f ext4 primary swap 2.5GB f swap primary /home 7.0GB f ext4 logical / 10.0GB f ext4 013.ubuntu查看所有组和用户 cat /etc/group sudo cat /etc/shadow 014.查看ip网址 https://ip.cn 或者 https://ipinfo.io 015.ubuntu下载ping和ifconfig命令 apt install iputils-ping apt install net-tools 016.ubuntu16.04关闭/开启mysql开机启动 // 禁止启动 sudo systemctl disable mysql # 开机启动 sudo systemctl enable mysql 017.查看一个目录下所有文件的数量(包括子目录下的文件,只算文件,不算目录) ls -lR|grep "^-"|wc -l 018.ubuntu设置mysql不区分大小写 // 在/etc/mysql/mysql.conf.d/mysqld.cnf文件中加一行代码: lower_case_table_names=1 019.关机 init 0 020.虚拟机切换到主机 Ctrl + Alt 021.清屏 Ctrl + l 022.取消某一操作 Ctrl + c 023.虚拟机BIOS设置 开机按F2(或虚拟机_电源_打开电源进入固件) 024.查看ip ifconfig 025.编辑文件 vim 026.保存退出 :wq 027.不保存退出 :q! 028.撤销 Esc + u 029.进入插入模式 i 030.复制粘贴 插入模式下选中一段文本,按下鼠标滚轮 031.重启 reboot(或者sudo shutdown -r now) 032.查看当前登录用户 whoami 033.切换用户 su - root(用户名) 034.进入全屏 VMware进入全屏Ctrl + Alt + Enter Xshell进入全屏Alt + Enter 035.创建新的文件 touch a.txt 036.复制一个文件夹下所有文件(包括子文件夹)到另一个文件夹下: cp -r /fangjian/tomcat8_new/webapps/ROOT/* /fangjian/bak/oa_20170905_test/ROOT 037.删除一个文件夹下所有文件(包括子文件夹) rm -rf /fangjian/bak/oa_20170905_test/* // 不加/*则删父文件夹 038.查看Linux是32位还是64位 sudo uname -m // i686表示是32位,x86_64表示是64位 039.解压压缩文件 tar -zxvf test.tar.gz 040.创建文件夹 mkdir java 041.为过长的目录建立一个链接 ln -s /usr/java/jdk1.8.0_60/ /usr/jdk 042.查看某进程名的PID ps -ef | grep java 043.根据端口号查看该端口号被谁占用 lsof -i:8080 // 若命令用不了,则需: yum -y install lsof或者: netstat -apn | grep 8080 044.根据进程PID查看该进程占用的端口号 netstat -nap | grep 2703 // 若命令用不了,则需: yum -y install net-tools 045.根据进程PID杀掉该进程 kill -9 2703 046.纯文本形式访问网址 elinks -dump http://www.baidu.com // 若命令用不了,则需: yum -y install elinks 047.RHEL7查看已启动的服务列表 systemctl list-unit-files|grep enabled 048.关闭虚拟机 shutdown -h now 049.Xshell锁屏 Ctrl+s 解锁: Ctrl+q 050.登录mysql mysql -h localhost -u root -proot 051.查看jdk安装路径 which java 或者: echo $JAVA_HOME 052.查看tomcat版本 进入tomcat的bin下执行sh version.sh 053.zip压缩文件 zip -r fileName.zip 文件夹名 解压缩: unzip fileName.zip 054.查看ubuntu版本 sudo lsb_release -a 055.复制一个文件夹下所有文件(包括子文件夹的所有文件但不复制目录,不考虑文件重名)到另一个文件夹下: find /home/dailin/ -type f -exec cp {} /home/c1 ; 056.显示所有ufw应用的配置 sudo ufw app list 057.vim快捷键 01.光标跳转到页面第一行: gg02.光标跳转到页面最后一行: Shift + g03.删除光标所在行: dd04.删除光标所在的向下n行: ndd n表示数字 05.清空文本:先执行:gg 再执行:d + (Shift + g)06.复制光标所在的行: yy07.复制光标所在的向下n行: nyy n表示数字08.将已复制的数据粘贴在光标的下一行: 小p表示09.将已复制的数据粘贴在光标的上一行: 大P10.撤销上一步操作: u (相当于windws的Ctrl + z)11.与u相反, 回到后一步操作: ctrl+r (相当于windws的Ctrl + y)12.重复前一个操作: . 点13.跳转到某一指定行: :12 跳转到第12行14.键入/后, 光标进入VIM底部的命令行, 这时就可以输入以/为开始的/搜索命令,按n搜索下一个,按N搜索上一个 058. 查看文件占用空间大小 du -ah -d 0 -a代表所有文件-h代表加单位-d 0代表: 只深入到第n层目录,若无此属性,则包含所有子目录 059.ubuntu查看磁盘空间 df -h 060.ubuntu永久修改主机名 1、查看主机名在Ubuntu系统中, 快速查看主机名有多种方法:其一, 打开一个GNOME终端窗口, 在命令提示符中可以看到主机名, 主机名通常位于“@”符号后;其二, 在终端窗口中输入命令:hostname或uname –n, 均可以查看到当前主机的主机名. 2、临时修改主机名命令行下运行命令:“hostname 新主机名”其中“新主机名”可以用任何合法字符串来表示. 不过采用这种方式, 新主机名并不保存在系统中, 重启系统后主机名将恢复为原先的主机名称. 例子:hostname ubuntu-temp这样主机名字就临时被修改为ubuntu-temp, 但是终端下不会立即显示生效后的主机名, 重开一个终端窗口(通过ssh连接的终端需要重新连接才可以); 3、永久修改主机名在Ubuntu系统中永久修改主机名也比较简单. 主机名存放在/etc/hostname文件中, 修改主机名时, 编辑hostname文件, 在文件中输入新的主机名并保存该文件即可. 重启系统后, 参照上面介绍的快速查看主机名的办法来确认主机名有没有修改成功. 值得指出的是, 在其它Linux发行版中, 并非都存在/etc/hostname文件. 如Fedora发行版将主机名存放在/etc/sysconfig/network文件中. 所以, 修改主机名时应注意区分是哪种Linux发行版. 4、/etc/hostname与/etc/hosts的区别/etc/hostname中存放的是主机名, hostname文件的一个例子:paulandcode /etc/hosts存放的是域名与ip的对应关系, 域名与主机名没有任何关系, 你可以为任何一个IP指定任意一个或多个名字, hosts文件的一个例子:(IP地址 hostname aliases) aliases可选127.0.0.1 localhost paulandcode127.0.1.1 v-jiwan-ubuntu 061.linux的bash命令一般存放在/sbin, /bin, /usr/bin,这几个目录中 062.ubuntu 显示相对路径 打开 home/paul/.bashrc 找到(可能有多处): PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ ' 修改将小写w改为大写W保存 执行source home/paul/.bashrc 063.Ubuntu的add-apt-repository: command not found sudo apt-get install software-properties-common python-software-properties 064.创建用户 adduser paul 创建用户 passwd paul 给已创建的用户testuser设置密码 userdel paul 用户名删除用户 给paul用户增加所有权限: vim /etc/sudoers 在root ALL=(ALL:ALL) ALL这一行的下面增加如下代码: paul ALL=(ALL:ALL) ALL 065.给用户增加sudu权限 1) 进入到root用户下. 2)添加文件的写权限. 也就是输入命令"chmod u+w /etc/sudoers". 3)编辑该文件,找到这一 行:"root ALL=(ALL) ALL"在起下面添加"yourName ALL=(ALL) ALL" 4)撤销文件的写权限. 也就是输入命令"chmod u-w /etc/sudoers" 066.删除除了某几个文件之外的所有文件 例:删除A文件夹下除了a文件夹和b.txt文件的其他所有文件和文件夹 rm -rf A/!(a|b.txt) 不过一般bash中运行后会提示 “-bash: !: event not found ” 可以通过运行shopt -s extgolb来解决. 如下: [root@localhost abc]# rm -f !(a) -bash: !: event not found [root@localhost abc]# shopt -s extglob [root@localhost abc]# rm -f !(a) [root@localhost abc]# ls a 067.linux脚本加入延时等待 默认以秒为单位,以后接时间的单位, 可以以m表示分钟, h表示小时, d表示天数 sleep 5 sleep 0.005 sleep 3m 068.awk -F ':' '{print $1"\t"$3}', 以冒号为分隔符后把第1,3列,以t分隔输出 例: kill掉第一个java进程id netstat -apn |grep java |awk '{print $7}' |xargs |awk -F '/' '{print $1}' |xargs kill -9 069.查看文件夹的目录结构 sudo tree /etc/nginx 070. Linux上的MySQL设置区分大小写 在/etc/mysql/mysql.conf.d/mysqld.cnf中最后一行加入如下代码: lower_case_table_names=1 071.Ubuntu安装MySQL sudo apt update sudo apt install mysql-server mysql-client 072. Linux下使用命令行导入, 导出MySQL数据库 (1) 导出数据库1> 只导出表结构, 格式: mysqldump -u用户名 -p密码 -d 数据库名 > 文件名.sql /usr/local/mysql/bin/mysqldump -uroot -p -d abc > file.sql 若-p后不加密码, 则敲回车后会提示输入密码 2> 导出表结构和数据, 格式: mysqldump -u用户名 -p密码 数据库名 > 文件名.sql /usr/local/mysql/bin/mysqldump -uroot -p abc > file.sql (2) 导入数据库1> 使用MySQL的Bash命令, 格式: mysql -u用户名 -p密码 数据库名 < 文件名.sql mysql -uroot -p abc < file.sql 2> 进入MySQL执行命令a.进入MySQL mysql -uroot -p b.选择数据库 use abc; c.设置数据库编码, 这个很关键, 否则会乱码 set names utf8; d.导入数据 source /home/abc/file.sql; 073. Linux重启后Tomcat自动启动 只需更改一个文件后重启即可: /etc/rc.local在文件结尾加入如下代码 export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64 export PATH=$JAVA_HOME/bin:$PATH export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar export CATALINA_HOME=/home/paul/apache-tomcat-9.0.0.M26 # tomcat自启动 /home/paul/apache-tomcat-9.0.0.M26/bin/startup.sh 074. 虚拟机上的Tomcat无法被主机访问 防火墙原因, 允许访问8080端口: sudo firewall-cmd --zone=public --add-port=8080/tcp --permanent sudo firewall-cmd --reload 如果不使用“--permanent”标记, 把么防火墙规则在重启后会失效. 075. Linux上的MySQL设置区分大小写 在/etc/mysql/mysql.conf.d/mysqld.cnf中最后一行加入如下代码: lower_case_table_names=1 076. Linux虚拟机桥接联网的配置文件 Linux虚拟机桥接联网时需要如下两个配置文件: 1. /etc/resolv.conf nameserver 8.8.8.8 2. /etc/sysconfig/network-scripts/ifcfg-eno16777736 TYPE="Ethernet" BOOTPROTO="static" IPADDR="192.168.0.66" NETWORK="255.255.255.0" GATEWAY="192.168.0.1" DNS1="8.8.8.8" DEFROUTE="yes" PEERDNS="yes" PEERROUTES="yes" IPV4_FAILURE_FATAL="no" IPV6INIT="yes" IPV6_AUTOCONF="yes" IPV6_DEFROUTE="yes" IPV6_PEERDNS="yes" IPV6_PEERROUTES="yes" IPV6_FAILURE_FATAL="no" NAME="eno16777736" UUID="96aa40e3-de9e-4074-b4ad-760d28ae2b66" DEVICE="eno16777736" ONBOOT="yes" 077. 如何Ping固定端口号 1. Windows 需要选择: 控制面板 --> 程序 --> 启动或关闭Windows功能, 在Telnet客户端和Telnet服务端打勾. 被Ping的机器需要服务端, 要Ping的机器需要客户端. 2. Linux若没有自带telnet, 需要安装客户端和服务端 3. 连接命令: telnet 127.0.0.1 8080 注意: IP和端口号之间是空格, 不是冒号.

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册