package LEX;
import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
public class lex {
static String[] key = { "do", "end", "for", "if", "printf", "scanf", "then", "while", "int", "float", "false",
"true", "then", "char", "break", "long", "return", "static", "struct", "void" };
//关键字表
static String code = "", file = "";
static char[] codex;
static int row = 1, n = 0, temp = 0, now;
//temp:数据类型 n:第 n 个
static JFrame frame, tab;
static JTable jt;
static JButton chooseButton, startButton, resetButton;
static JTextField fileField;
static JPanel northPanel, centralPanel, southPanel;
static JTextArea mapArea;
//不需要实例化对象就可以引用成员
public static void main(String[] args) throws Exception {
creatGUI();
}
public static void analysis() {
String header[] = { "单词", "二元序列", "类型", "位置" };
DefaultTableModel md = new DefaultTableModel(header, 0);
//表格
jt.setModel(md);
do {
String get = Scanner();
switch (temp) {
case -1:
String[] forGui = { get, "Error", "Error", "(" + row + "," + n + ")" };
md.addRow(forGui);
break;
case 0:
break;
case 1:
String[] forGui1 = { get, "(1," + get + ")", "关键字", "(" + row + "," + n + ")" };
md.addRow(forGui1);
break;
case 2:
String[] forGui2 = { get, "(2," + get + ")", "分界符", "(" + row + "," + n + ")" };
md.addRow(forGui2);
break;
case 3:
String[] forGui3 = { get, "(3," + get + ")", "算数运算符", "(" + row + "," + n + ")" };
md.addRow(forGui3);
break;
case 4:
String[] forGui4 = { get, "(4," + get + ")", "关系运算符", "(" + row + "," + n + ")" };
md.addRow(forGui4);
break;
case 5:
String[] forGui5 = { get, "(5," + get + ")", "常数", "(" + row + "," + n + ")" };
md.addRow(forGui5);
break;
case 6:
String[] forGui6 = { get, "(6," + get + ")", "标识符", "(" + row + "," + n + ")" };
md.addRow(forGui6);
break;
case 7:
break;
}
} while (temp != 0);
jt.setModel(md);
jt.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
//表格大小按比例
JScrollPane scroll = new JScrollPane(jt);
scroll.setSize(300, 200);
tab = new JFrame();
tab.add(scroll);
tab.setSize(500, 400);
tab.setVisible(true);
tab.setTitle("Lex-Analysis");
tab.setLocationRelativeTo(null);
//指定位置默认
}
public static String Scanner() { //scanner一次执行一个
if (now >= codex.length) {
temp = 0;
return "";
}
//操作结束
char ch = codex[now++];
String token = "";
while (ch == ' ' || ch == '\t' || ch == '\n') {
ch = codex[now];
now ++;
}
if ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z')) {
while ((ch >= '0' && ch <= '9') || (ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z')) {
token = token + ch;
ch = codex[now++];
}
now--;
//token提取了整个字符串
token = token.toLowerCase();
//全部转为小写进行比较
for (int i = 0; i < key.length; i++) { //关键字key
if (token.equals(key[i])) {
temp = 1;
n++;
return token;
}
}
temp = 6;
n++;
return token;
} else if (ch >= '0' && ch <= '9') {
int flag = 0;
while (ch !=' ' && ch !=';'&& ch !='/'&& ch!='+'&& ch!='-'&& ch!='*'&& ch!='='&& ch!='<'&& ch!='>'
&& ch!=','&& ch!='('&& ch!=')'&& ch!='['&& ch!=']'&& ch!='#') {
//数字肯定以数字结尾
token = token + ch;
if(ch == '.')
flag++;
if((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z')) {
temp = -1;
}
//数字后面跟字母
ch = codex[now++];
}
//小数点不能超过1个
now--;
if(flag >= 2)
temp = -1;
if(temp != -1)
temp = 5;
n++;
return token;
} else {
switch (ch) {
case '<':
ch = codex[now++];
if (ch == '>') {
temp = 4;
n++;
return "<>";
} else if (ch == '=') {
temp = 4;
n++;
return "<=";
} else {
now--;
temp = 4;
n++;
return "<";
}
case '>':
ch = codex[now++];
if (ch == '=') {
temp = 4;
n++;
return ">=";
} else {
now--;
temp = 4;
n++;
return ">";
}
case '=':
ch = codex[now++];
if (ch == '=') {
temp = 4;
n++;
return "==";
} else {
now--;
n++;
temp = 4;
return "=";
}
case '#':
row ++;
n = 0;
temp = 7;
return "";
//手动在每一行行末尾加上了#以便判断
case '+':
ch = codex[now++];
if (ch == '+') {
temp = -1;
n++;
return "++";
} else {
temp = 3;
n++;
now--;
return "+";
}
case '-':
ch = codex[now++];
if (ch == '-') {
temp = -1;
n++;
return "--";
} else {
temp = 3;
n++;
now--;
return "-";
}
case '*':
if(codex[now++]!='/'){
temp = 3;
n++;
now--;
return "*";
}else{
temp = 2;
n++;
return "*/";
}
case '/':
ch = codex[now++];
if(ch!='/'&&ch!='*'){
temp = 3;
n++;
now--;
return "/";
}else if(ch=='/'){
temp = 2;
while (ch != '#') {
ch = codex[now];
now ++;
}
now--;
return "//"; //消除换行符
}else if(ch=='*'){
temp = 2;
n++;
while(ch!='/') {
while (ch != '*') {
ch = codex[now++];
}
ch = codex[now++];
}
now = now - 2;
return "/*"; //消除换行符
}
case '"':
temp = 2;
n++;
return "\"";
case '(':
temp = 2;
n++;
return "(";
case ')':
temp = 2;
n++;
return ")";
case '[':
temp = 2;
n++;
return "[";
case ']':
temp = 2;
n++;
return "]";
case '{':
temp = 2;
n++;
return "{";
case '}':
temp = 2;
n++;
return "}";
case ',':
temp = 2;
n++;
return ",";
case ';':
temp = 2;
n++;
return ";";
default:
break;
}
}
temp = -1;
//其他情况
n++;
return String.valueOf(ch);
}
public static void creatGUI() {
chooseButton = new JButton("File");
chooseButton.setBackground(Color.white);
chooseButton.setPreferredSize(new Dimension(80, 30));
startButton = new JButton("Start");
startButton.setBackground(Color.white);
startButton.setPreferredSize(new Dimension(80, 30));
resetButton = new JButton("Reset");
resetButton.setBackground(Color.white);
resetButton.setPreferredSize(new Dimension(80, 30));
fileField = new JTextField("", 23);
fileField.setBorder(BorderFactory.createLineBorder(Color.gray));
mapArea = new JTextArea(10, 25);
mapArea.setEditable(false);
mapArea.setBorder(BorderFactory.createLineBorder(Color.gray));
northPanel = new JPanel();
northPanel.setBackground(Color.white);
northPanel.add(fileField);
centralPanel = new JPanel();
centralPanel.setBackground(Color.white);
centralPanel.add(chooseButton);
centralPanel.add(mapArea);
southPanel = new JPanel();
southPanel.setBackground(Color.white);
southPanel.add(startButton);
southPanel.add(resetButton);
southPanel.setLayout(new FlowLayout(FlowLayout.RIGHT));
frame = new JFrame();
frame.add(northPanel, BorderLayout.NORTH);
frame.add(centralPanel, BorderLayout.CENTER);
frame.add(southPanel, BorderLayout.SOUTH);
frame.setTitle("Lex");
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.E
lex_编译原理_java_词法分析器_lex读取文件_lex描述文件_
版权申诉
5星 · 超过95%的资源 59 浏览量
2021-09-29
18:19:54
上传
评论 1
收藏 3KB RAR 举报
呼啸庄主
- 粉丝: 74
- 资源: 4702
最新资源
- Sunfounder智能视频车载套件,适用于Raspberry Pi-智能车
- 计算机二级考试的一些编程题(大学生专用 )-计算机二级
- 2019年之江杯人工智能大赛电商评论观点挖掘赛道TOP3-电赛
- 基于PCA和SVM的人脸识别
- Python 爬虫爬取 Instagram 博主照片视频-Python 爬虫
- dot-font字体库
- 实现各种面向对象设计模式的C + +项目集合-Object-C
- 硬件设计基础:数字电压表;51单片机蓝牙通信+Proteus 仿真
- 用于使用JavaScript制作Scratch类项目的库-Scratch
- 2005-2022年全国及31省绿色信贷水平原始数据及测算(含原始数据+计算过程+计算结果).xls
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
- 1
- 2
- 3
前往页