词法分析器
注:解析中文如果用c/c++的话要用对应的库,如果用char数组和std::string用下标访问是半个字符,这样是会出错的
。。。
进行词法分析,我们需要先制定规则,然后映射到解析代码中
。。。
顺便说一下,词法分析器能做的语法分析器都能做,所以会出现一些差异,例如gdscript的var可以在词法分析时解析为保留字,也可以在词法分析时解析为与变量名一类的“单词”,之后在语法分析阶段再看看是不是保留字。
。。。
平衡简单和通用,制定规则时有以下规则
能将分析规则画成确定有限状态机,这样就不会出现回退。为了进一步化简,可以引出:
进入字符集(变量名的字母或下划线),持续字符集,退出字符集(对于变量名,是空格或换行)。持续字符集和退出字符集交集应该为空。
。。。
映射后的语句是
初始,while(true){
读取字符
根据进入字符集进入不同的解析
}
对于数字或“单词”长度“无限”的
parse_xx():
while(true){
读取字符
如果是退出字符集,退出循环;
如果是持续字符集,进行处理(如整数的sum=sum*10+数字,“单词”的拼接字符)
}
退出循环后提交token,内容有type,value
对于有限符号
例如区分"=="和"=",需要向前看一个字符,多写几个if分支一下就行了
。。。
一般来说,需要满足下面的目标:
“单词”,整数,小数,字符串字面量,有限长度的符号
之后的十六进制等解析难度在质上没有质的变化。
。。。
词法分析的退化
其实写while循环对于刚开始接触的人来说容易写错(但比二叉查找好写
),有一些调用函数的方法。
一个是正则表达式,要能够查找匹配位置(有的函数只返回能不能匹配),上面while方法能做的正则表达式都能做。
一个是用字符串的split函数,适用于命令解析,对于表达式不带空格的和字符串字面量不擅长。
注:解析中文如果用c/c++的话要用对应的库,如果用char数组和std::string用下标访问是半个字符,这样是会出错的
。。。
进行词法分析,我们需要先制定规则,然后映射到解析代码中
。。。
顺便说一下,词法分析器能做的语法分析器都能做,所以会出现一些差异,例如gdscript的var可以在词法分析时解析为保留字,也可以在词法分析时解析为与变量名一类的“单词”,之后在语法分析阶段再看看是不是保留字。
。。。
平衡简单和通用,制定规则时有以下规则
能将分析规则画成确定有限状态机,这样就不会出现回退。为了进一步化简,可以引出:
进入字符集(变量名的字母或下划线),持续字符集,退出字符集(对于变量名,是空格或换行)。持续字符集和退出字符集交集应该为空。
。。。
映射后的语句是
初始,while(true){
读取字符
根据进入字符集进入不同的解析
}
对于数字或“单词”长度“无限”的
parse_xx():
while(true){
读取字符
如果是退出字符集,退出循环;
如果是持续字符集,进行处理(如整数的sum=sum*10+数字,“单词”的拼接字符)
}
退出循环后提交token,内容有type,value
对于有限符号
例如区分"=="和"=",需要向前看一个字符,多写几个if分支一下就行了
。。。
一般来说,需要满足下面的目标:
“单词”,整数,小数,字符串字面量,有限长度的符号
之后的十六进制等解析难度在质上没有质的变化。
。。。
词法分析的退化
其实写while循环对于刚开始接触的人来说容易写错(但比二叉查找好写

一个是正则表达式,要能够查找匹配位置(有的函数只返回能不能匹配),上面while方法能做的正则表达式都能做。
一个是用字符串的split函数,适用于命令解析,对于表达式不带空格的和字符串字面量不擅长。