前情提要:
自己慢慢摸索写出的集词法分析、递归下降分析、LL1、波兰式于一体的且带有UI界面的程序。
以下是四个实验目的阐述与结果截图,会贴上最重要的代码。
由于代码有些大,会附有链接收取一点点积分换取完整代码。
实验一:词法分析
实验目的
通过设计编制调试一个具体的词法分析程序,加深对词法分析原理的理解。并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。
编制一个读单词过程,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。并依次输出各个单词的内部编码及单词符号自身值。(遇到错误时可显示“Error”,然后跳过错误部分继续显示)
实验截图
实验代码
import javax.swing.JTextArea;
public class LexicalAnalyzer {
static String[] rwtab=new String[]{"main","if","then","while","do","static",
"int","double","struct","break","else",
"long","switch","case","typedef","char",
"return","const","float","short","continue",
"for","void","sizeof"}; //定义的24个关键字,种别码从1开始
static String storage=""; //存储源程序字符串
static StringBuilder token=new StringBuilder(""); //存储单词自身组成的字符串
private char lastchar; //单个读取字符
private int index=0; //单行字符串脚标
private int syn; //种别码
private int row=1;
//分析器
void analyzer(){
token.delete(0, token.length()); //置空token对象,清除
lastchar=storage.charAt(index); //索引指向第0位
if(((lastchar>='a'&&lastchar<='z')||(lastchar>='A'&&lastchar<='Z'))&&index<storage.length()){ //可能是关键字或者自定义的标识符
index++;
token.append(lastchar);
while(((lastchar>='0'&&lastchar<='9')||(lastchar>='a'&&lastchar<='z')||(lastchar>='A'&&lastchar<='Z'))&&index<storage.length()){
lastchar=storage.charAt(index++);
if((lastchar>='0'&&lastchar<='9')||(lastchar>='a'&&lastchar<='z')||(lastchar>='A'&&lastchar<='Z')) {
token.append(lastchar);
}else {
index--;
}
}
syn=2; //默认为识别出的字符串为自定义的标识符,种别码为2
String s=token.toString();
for(int i=0; i<rwtab.length; i++){
if(s.equals(rwtab[i])){
syn=1;
break; //识别出是关键字
}
}
}else if((lastchar>='0'&&lastchar<='9')&&index<storage.length()){ //数字
index++;
token.append(lastchar);
while((lastchar>='0'&&lastchar<='9'||lastchar=='.')&&index<storage.length()){
lastchar=storage.charAt(index++);
if((lastchar>='0'&&lastchar<='9')||lastchar=='.') {
token.append(lastchar);
}else {
index--;
}
}
syn=3; //整数的种别码为3
}else if(index<storage.length()){
index++;
switch(lastchar){
case '+':
case '-':
case '*':
token.append(lastchar);
syn=4;
break;
case '<':
token.append(lastchar);
syn=4;
if(index<storage.length()) {
lastchar=storage.charAt(index);
if(lastchar=='='){
token.append(lastchar);
index++;
}else if(lastchar=='>'){
token.append(lastchar);
index++;
}
}
break;
case '>':
token.append(lastchar);
syn=4;
if(index<storage.length()) {
lastchar=storage.charAt(index);
if(lastchar=='='){
token.append(lastchar);
syn=4;
index++;