编译原理词法分析器java
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验一词法分析器的设计
一、实验目的
1.理解词法分析器的任务和输出形式
2.理解扫描器的工作原理
3.掌握状态转换图的绘制以及单词的识别技术
4.掌握词法分析器的设计过程,能够使用某种高级语言实现一个词法分析器
二、实验环境
Myeclipse
三、实验要求
给出一个简单的词法语言规则描述,其中:1开头的种别码为关键词,2开头的为算符,3开头的为界符,4开头的为标识符,5开头的为常数,标识符为字母开头,以字母和数字组成的任意符号串,常数为整数,即以数字组成的符号串。
四、实验难点
1.对整数的二进制转换,以及对指针的操作
2.标识符的设置
五、实验代码
1.ciFa.Java
package com.yaoer.test1;
import javax.swing.*;
import javax.swing.border.TitledBorder;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
@SuppressWarnings("serial")
public class ciFa extends JFrame{
private JButton jbtShow = new JButton("进行词法分析");//按钮
private JTextArea jta = new JTextArea();//输入文本框
private JTextArea jtaOut = new JTextArea();//输出文本框
private JPanel jpl=new JPanel();
private String intput ="";
private String output ="";
private compiler comp = new compiler();
* @param args
*/
public static void main(String[] args)
{
ciFa frame = new ciFa();
frame.setTitle("词法分析器");
//frame.setLocationRelativeTo(frame);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(500, 400);
frame.setVisible(true);
}
public ciFa()
{
jta.setWrapStyleWord(true);
jta.setLineWrap(true);
jtaOut.setWrapStyleWord(true);
jtaOut.setLineWrap(true);
jtaOut.setEditable(false);
JScrollPane scrollPane = new JScrollPane(jta);
JScrollPane scrollPane2 = new JScrollPane(jtaOut);
scrollPane.setPreferredSize(new Dimension(300,300));
scrollPane2.setPreferredSize(new Dimension(300,300));
jtaOut.setBorder(new TitledBorder("词法分析结果"));
jta.setBorder(new TitledBorder("请在这输入"));
jpl.setLayout(new GridLayout(2,2));
jpl.add(jta);
jpl.add(jtaOut);
add(jbtShow,BorderLayout.SOUTH);
add(jpl);
jbtShow.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
intput = jta.getText();
output=puterComp(intput);
jtaOut.append(output);
}
});
}
piler.Java
package com.yaoer.test1;
public class compiler {
public String computerComp(String str)
{
String output="";
int index=0;
int k = 0;
while(index { if(isJieFu(str.charAt(index))!=-1){ //判断界符 output+=("( 30"+isJieFu(str.charAt(index))+" "+str.charAt(index)+" 界符)"); index++; }else if(isMath(str.charAt(index))){ //判断常数 int index1=index; output+=("( "); String sub; String result; while(isMath(str.charAt(index))){ output+=(str.charAt(index)); index++; if(index>=str.length()){ if(str.charAt(index1)=='0'){ if(index1+1>=str.length()){ sub =str.substring(index1, index); result = Zhuan(sub); output+=(" "+result+" 数字)"); }else{ if(isMath(str.charAt(index1+1))){ output+=(" 非法字符)"); } else{ sub =str.substring(index1, index); result = Zhuan(sub); output+=(" "+result+" 数字)"); } } }else{ sub =str.substring(index1, index); result = Zhuan(sub); output+=(" "+result+" 数字)");