Java词法分析器

合集下载

解释并执行指令的功能部件

解释并执行指令的功能部件

解释并执行指令的功能部件一、指令解释器指令解释器是计算机系统中的一个重要组成部分,它负责解释并执行用户输入的指令。

指令解释器通常由以下几个功能部件组成。

1. 词法分析器词法分析器负责将输入的指令拆分成一个个的词法单元,例如关键字、运算符、变量名等等。

它通过扫描输入流,并根据预先定义的规则将输入分解成词法单元序列。

2. 语法分析器语法分析器负责将词法单元序列转化为语法结构,并构建语法树。

它通过对词法单元序列进行分析,并根据语法规则判断输入的指令是否符合语法要求。

3. 语义分析器语义分析器负责对语法树进行分析,并进行语义检查。

它会检查变量的声明和使用是否合法,检查函数的参数传递是否正确,以及执行类型检查等等。

二、指令执行器指令执行器是指令解释器的另一个重要部分,它负责执行解释器解析出来的指令,并将结果返回给用户。

指令执行器通常由以下几个功能部件组成。

1. 变量管理器变量管理器负责管理程序中的变量,包括变量的声明、赋值、读取等操作。

它会为每个变量分配内存空间,并记录变量的值和类型。

2. 运算器运算器负责执行指令中的运算操作,例如加减乘除、逻辑运算等。

它会根据指令中的运算符和操作数进行相应的计算,并返回计算结果。

3. 控制流管理器控制流管理器负责管理程序的控制流,包括条件判断、循环控制等。

它会根据指令中的条件判断语句或循环语句来决定程序的执行路径。

4. 输入输出管理器输入输出管理器负责处理程序的输入和输出。

它会从输入设备中读取数据,并将计算结果输出到输出设备中。

三、指令解释器的工作流程指令解释器的工作流程可以简述为以下几个步骤:1. 词法分析:将输入的指令拆分成一个个的词法单元。

2. 语法分析:将词法单元序列转化为语法结构,并构建语法树。

3. 语义分析:对语法树进行分析,并进行语义检查。

4. 指令解释:根据语义分析的结果,执行相应的操作。

5. 结果返回:将执行结果返回给用户。

四、指令解释器的应用领域指令解释器广泛应用于各种计算机系统和编程语言中。

el表达式解析原理java

el表达式解析原理java

el表达式解析原理javaEL(Expression Language)表达式是一种用于在JSP和JavaEE应用程序中获取和操作数据的简单表达式语言。

它最初由JavaServer Pages规范定义,并在JSP 2.0中首次引入。

EL表达式提供了一种轻量级的方式来访问和操作JavaBean组件、集合和映射中的数据,而不需要编写复杂的Java代码。

在Java中解析EL表达式需要借助于EL表达式解析器。

在Java EE中,EL表达式解析器由Servlet容器负责创建和管理。

EL表达式的解析原理如下:1. 词法分析(Lexical Analysis):EL表达式的解析器首先将输入的EL表达式分解成一个个Token。

Token是词法分析的基本单元,代表一个特定的语法结构或数据类型。

比如,`'${'`、`'['`、`'('`、`'}'`、`']'`、`')'`、`.`、`'.'`、`','`等都可以作为Token。

2. 语法分析(Syntax Analysis):EL表达式的解析器根据Token序列构建抽象语法树(AST,Abstract Syntax Tree)。

语法分析器将Token按照语法规则进行组合,并创建AST节点。

例如,`${}`将被解析为一个AST节点,最终生成的AST如下所示:```. (property access)/ \person name```这个AST表示了一个属性访问,从`person`对象中获取`name`属性的值。

3. 语义分析(Semantic Analysis):EL表达式的解析器对AST进行语义分析,验证表达式的语义正确性。

它会检查使用的变量、函数是否存在,以及操作符是否支持操作数的数据类型等。

如果发现语义错误,解析器将抛出异常并中断解析过程。

编译原理语法分析器(java完美运行版)

编译原理语法分析器(java完美运行版)

编译原理语法分析器(java完美运行版)第一篇:编译原理语法分析器 (java完美运行版)实验二语法分析器一、实验目的通过完成预测分析法的语法分析程序,了解预测分析法和递归子程序法的区别和联系。

使学生了解语法分析的功能,掌握语法分析程序设计的原理和构造方法,训练学生掌握开发应用程序的基本方法。

有利于提高学生的专业素质,为培养适应社会多方面需要的能力。

二、实验内容υ根据某一文法编制调试 LL(1)分析程序,以便对任意输入的符号串进行分析。

υ构造预测分析表,并利用分析表和一个栈来实现对上述程序设计语言的分析程序。

υ分析法的功能是利用LL(1)控制程序根据显示栈栈顶内容、向前看符号以及LL(1)分析表,对输入符号串自上而下的分析过程。

三、LL(1)分析法实验设计思想及算法υ模块结构:(1)定义部分:定义常量、变量、数据结构。

(2)初始化:设立LL(1)分析表、初始化变量空间(包括堆栈、结构体、数组、临时变量等);(3)控制部分:从键盘输入一个表达式符号串;(4)利用LL(1)分析算法进行表达式处理:根据LL(1)分析表对表达式符号串进行堆栈(或其他)操作,输出分析结果,如果遇到错误则显示错误信息。

四、实验要求1、编程时注意编程风格:空行的使用、注释的使用、缩进的使用等。

2、如果遇到错误的表达式,应输出错误提示信息。

3、对下列文法,用LL(1)分析法对任意输入的符号串进行分析:(1)E->TG(2)G->+TG|—TG(3)G->ε(4)T->FS(5)S->*FS|/FS(6)S->ε(7)F->(E)(8)F->i 输出的格式如下:五、实验源程序LL1.java import java.awt.*;import java.awt.event.*;import javax.swing.*;import javax.swing.table.DefaultTableModel;import java.sql.*;import java.util.Vector;public class LL1 extends JFrame implements ActionListener { /****/private static final long serialVersionUID = 1L;JTextField tf1;JTextField tf2;JLabel l;JButton b0;JPanel p1,p2,p3;JTextArea t1,t2,t3;JButton b1,b2,b3;JLabel l0,l1,l2,l3,l4;JTable table;Statement sta;Connection conn;ResultSet rs;DefaultTableModel dtm;String Vn[]=null;Vector P=null;int firstComplete[]=null;//存储已判断过first的数据char first[][]=null;//存储最后first结果int followComplete[]=null;//存储已判断过follow的数据char follow[][]=null;//存储最后follow结果char select[][]=null;//存储最后select结果int LL=0;//标记是否为LL(1)String vt_tou[]=null;//储存VtObject shuju[][]=null;//存储表达式数据char yn_null[]=null;//存储能否推出空LL1(){ setLocation(100,0);setSize(700,780);tf1=new JTextField(13);tf2=new JTextField(13);l=new JLabel(“>>”);l0=new JLabel(“输入字符串:”);l1=new JLabel(“输入的文法”);l2=new JLabel(“ ”);l3=new JLabel(“分析的结”);l4=new JLabel(“预测分析”);//p1=new JPanel();p2=new JPanel();p3=new JPanel();t1=new JTextArea(24,20);t2=new JTextArea(1,30);t3=new JTextArea(24,40);b0=new JButton(“确定(S为开始)”);b1=new JButton(“ 判断文法”);为:果:表:b2=new JButton(“输入”);b3=new JButton(“清空”);table=new JTable();JScrollPane jp1=new JScrollPane(t1);JScrollPane jp2=new JScrollPane(t2);JScrollPane jp3=new JScrollPane(t3);p2.add(tf1);p2.add(l);p2.add(tf2);p2.add(b0);p2.add(b1);p2.add(l0);p2.add(l2);p2.add(jp2);p2. add(b2);p2.add(b3);p2.add(l1);p2.add(l3);p2.add(jp1);p2.add(jp3);p3.add(l4);p3.add(newJScrollPane(table));add(p2,“Center”);add(p3,“South”);b0.addActionListener(this);b1.addActionListener(this);b2.ad dActionListener(this);b3.addActionListener(this);setDefaultClose Operation(JFrame.EXIT_ON_CLOSE);table.setPreferredScrollable ViewportSize(new Dimension(660,200));setVisible(true);} public void actionPerformed(ActionEvent e){ if(e.getSource()==b0){ String a=tf1.getText();String b=tf2.getText();t1.append(a+'→'+b+'n');}if(e.getSource()==b1){ t3.setText(“");int Vnnum=0,k;Vn=new String[100];P=new Vector();String s[]=t1.getText().split(”n“);for(int i=0;ireturn;}if(s[i].charAt(0)<='Z'&&s[i].charAt(0)>='A'&&s[i].charAt(1)=='→'){ for(k=0;k=Vnnum){ Vn[Vnnum]=s[i].substring(0, 1);//存入Vn数据 Vnnum++;} P.add(s[i]);} else { t3.setText(”文法输入有误,请重新输入“);return;} } yn_null=new char[100];first=new char[Vnnum][100];int flag=0;String firstVn[]=null;firstComplete=new int[Vnnum];for(int i=0;Vn[i]!=null;i++)//依次求FIRST** { flag=0;firstVn=new String[20];if((flag=add_First(first[i],Vn[i],firstVn,flag))==-1)return;firstComplete[i]=1;} t3.append(”first集:“+”n“);//显示FIRST**for(inti=0;Vn[i]!=null;i++){ t3.append(”first(“+Vn[i]+”)={ “);for(int j=0;first[i][j]!='';j++){ t3.append(first[i][j]+” , “);} t3.append(”}“+”n“);}follow=new char[Vnnum][100];String followVn[]=null;followComplete=new int[Vnnum];for(int i=0;Vn[i]!=null;i++)//求FOLLOW** { flag=0;followVn=new String[20];if((flag=tianjiaFollow(follow[i],Vn[i],followVn,flag))==-1)return;followComplete[i]=1;} t3.append(”fol low集:“+”n“);//显示FOLLOW**for(inti=0;Vn[i]!=null;i++){ t3.append(”follow(“+Vn[i]+”)={ “);for(i nt j=0;follow[i][j]!='';j++){ t3.append(follow[i][j]+” , “);} t3.append(”}“+”n“);} select=new char[P.size()][100];for(int i=0;itianjiaSelect(select[i],(String)P.elementAt(i),flag);}t3.append(”select集:“+”n“);//显示SELECT**for(int i=0;ifor(int i=0;Vn[i]!=null;i++)//判断select交集是否为空{ intbiaozhi=0;char save[]=new char[100];for(int j=0;jif(t.substring(0,1).equals(Vn[i])){ for(k=0;select[j][k]!='';k++){ if(puanduanChar(save,select[j][k])){ save[biaozhi]=select[j][k];bia ozhi++;} else//当有交集时,不为LL(1)文法{ t3.append(”不是LL(1)文法!“+”n“);return;} } } } } char Vt[]=new char[100];int biaozhi=0;for(int i=0;i{ if(t.charAt(j)>'Z'||t.charAt(j)<'A'){ if(puanduanChar(Vt,t.cha rAt(j))){ Vt[biaozhi]=t.charAt(j);biaozhi++;} } } } if(puanduanChar(Vt,'#'))//若可推出空集,则将#加入Vt。

Java编写的词法分析器

Java编写的词法分析器

import java.awt.Color;import ;import java.io.BufferedReader;import java.io.File;import java.io.FileNotFoundException;import java.io.FileReader;import java.io.IOException;import java.util.ArrayList;import javax.swing.ImageIcon;import javax.swing.JFileChooser;import javax.swing.JOptionPane;import javax.swing.UIManager;/***@author龙魂*@copyRight(R)2009_mythinfuture*//***Sample application analysing C code to accidence file*词法分析程序,分析C源代码,找出其中的单词,并确定单词的类型*关键字KEY*标识符ID*整数INTEGER*浮点数FLOAT*指数EXPONENT*分隔符SEPARATOR*操作符OPERATOR*预定义符PRETREATMENT*字符串STRING如"string"*字符CHAR如'c'*错误字符ERROR***/public class analyseTest extends javax.swing.JFrame {/**Creates new form analyseTest*/public analyseTest() {super("模拟词法分析器");try{UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); }catch(Exception err){err.printStackTrace();}initComponents();this.setResizable(false);this.setSize(870, 540);this.setVisible(true);}private void initComponents() {sourceLabel = new javax.swing.JLabel();charListTextArea = new java.awt.TextArea();sourceProgrammeTextArea = new java.awt.TextArea();identifierTextArea = new java.awt.TextArea();charListLabel = new javax.swing.JLabel();identifierLabel = new javax.swing.JLabel();MenuBar = new javax.swing.JMenuBar();fileMenu = new javax.swing.JMenu();openMenuItem = new javax.swing.JMenuItem();saveMenuItem = new javax.swing.JMenuItem();exitMenuItem = new javax.swing.JMenuItem();compilerMenu = new javax.swing.JMenu();beginMenuItem = new javax.swing.JMenuItem();aboutMenu = new javax.swing.JMenu();sourceProgrammeTextArea.setEditable(false);charListTextArea.setEditable(false);identifierTextArea.setEditable(false);setDefaultCloseOperation(3);getContentPane().setLayout(null);sourceLabel.setFont(new java.awt.Font("微软雅黑", 0, 16));sourceLabel.setText("\u6e90\u7a0b\u5e8f\u533a");getContentPane().add(sourceLabel);sourceLabel.setBounds(110, 50, 110, 22);getContentPane().add(charListTextArea);charListTextArea.setBounds(300, 90, 280, 370);charListTextArea.setFont(new java.awt.Font("微软雅黑", 0, 14));getContentPane().add(sourceProgrammeTextArea);sourceProgrammeTextArea.setBounds(10, 90, 290, 370);sourceProgrammeTextArea.setFont(new java.awt.Font("微软雅黑", 0, 14)); getContentPane().add(identifierTextArea);identifierTextArea.setBounds(580, 90, 260, 370);identifierTextArea.setFont(new java.awt.Font("微软雅黑", 0, 14)); charListLabel.setFont(new java.awt.Font("微软雅黑", 0, 16)); charListLabel.setText("\u5355\u8bcd\u5e8f\u5217\u8868"); getContentPane().add(charListLabel);charListLabel.setBounds(400, 50, 80, 22);identifierLabel.setFont(new java.awt.Font("微软雅黑", 0, 16)); identifierLabel.setText("\u6807\u8bc6\u7b26\u8868");getContentPane().add(identifierLabel);identifierLabel.setBounds(680, 50, 80, 22);fileMenu.setFont(new java.awt.Font("微软雅黑", 0, 16));fileMenu.setText("\u6587\u4ef6");openMenuItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke( java.awt.event.KeyEvent.VK_O,java.awt.event.InputEvent.CTRL_MASK));openMenuItem.setFont(new java.awt.Font("微软雅黑", 0, 14)); openMenuItem.setText("\u6253\u5f00");openMenuItem.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { openMenuItemActionPerformed(evt);}});fileMenu.add(openMenuItem);saveMenuItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke( java.awt.event.KeyEvent.VK_S,java.awt.event.InputEvent.CTRL_MASK));saveMenuItem.setFont(new java.awt.Font("微软雅黑", 0, 14)); saveMenuItem.setText("\u4fdd\u5b58");saveMenuItem.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { saveMenuItemActionPerformed(evt);}});fileMenu.add(saveMenuItem);exitMenuItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke( java.awt.event.KeyEvent.VK_E,java.awt.event.InputEvent.CTRL_MASK));exitMenuItem.setFont(new java.awt.Font("微软雅黑", 0, 14)); exitMenuItem.setText("\u9000\u51fa");exitMenuItem.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { exitMenuItemActionPerformed(evt);}});fileMenu.add(exitMenuItem);MenuBar.add(fileMenu);compilerMenu.setFont(new java.awt.Font("微软雅黑", 0, 16)); compilerMenu.setText("\u7f16\u8bd1");beginMenuItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke( java.awt.event.KeyEvent.VK_B,java.awt.event.InputEvent.CTRL_MASK));beginMenuItem.setFont(new java.awt.Font("微软雅黑", 0, 14)); beginMenuItem.setText("\u5f00\u59cb\u7f16\u8bd1");beginMenuItem.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { beginMenuItemActionPerformed(evt);}});compilerMenu.add(beginMenuItem);MenuBar.add(compilerMenu);aboutMenu.setFont(new java.awt.Font("微软雅黑", 0, 16)); aboutMenu.setText("\u5173\u4e8e");aboutMenu.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { aboutMenuActionPerformed(evt);}});MenuBar.add(aboutMenu);setJMenuBar(MenuBar);pack();}private void aboutMenuActionPerformed(java.awt.event.ActionEvent evt){JOptionPane.showMessageDialog(this, " 作者:吴国龙 \n copyRight (R)2009 mythinfuture","友情提示",JOptionPane.OK_OPTION,newImageIcon("src//picture//wondering.gif"));}/***打开待分析文件**/private void openMenuItemActionPerformed(java.awt.event.ActionEvent evt) { JFileChooser file=new JFileChooser();BufferedReader get=null;String lineString=null;ImageIcon icon=new ImageIcon("src\\picture\\wondering.gif");int returnVal = file.showOpenDialog(this);if (returnVal == JFileChooser.APPROVE_OPTION) {sourceProgrammeTextArea.setText(null); // 分析新程序,置空三个文本区charListTextArea.setText(null);identifierTextArea.setText(null);sourFile = file.getSelectedFile();if(sourFile.getName().trim().charAt(sourFile.getName().length()-1)=='c'){try {get=new BufferedReader(new FileReader(sourFile));while((lineString=get.readLine( ))!=null){sourceProgrammeTextArea.append(lineString+"\n");}this.setTitle("词法分析器 - " + sourFile.getName());sourceProgrammeTextArea.setBackground(Color.pink);} catch (FileNotFoundException ioe) { //写到这里JOptionPane.showMessageDialog(this, "对不起,文件打开失败!!","友情提示", JOptionPane.ERROR_MESSAGE,icon);} catch (IOException e) {e.printStackTrace();}}else{JOptionPane.showMessageDialog(this, " 对不起,本词法分析器只能词法分析C 源程序!!","友情提示", JOptionPane.ERROR_MESSAGE,icon);}}}/** 进行词法分析* */private void beginMenuItemActionPerformed(java.awt.event.ActionEvent evt) { if(sourceProgrammeTextArea.getText().trim().length()==0){JOptionPane.showMessageDialog(this, "对不起,您还没有选择分析源文件哦!!","友情提示",JOptionPane.OK_OPTION,newImageIcon("src//picture//wondering.gif"));}else{ImageIcon icon=new ImageIcon("src\\picture\\open.gif");JOptionPane.showMessageDialog(this, "正在分析中........","友情提示",JOptionPane.OK_OPTION,icon);charListTextArea.setBackground(Color.PINK);analyseFile();tokenFile();}}/** 退出程序* */private void exitMenuItemActionPerformed(java.awt.event.ActionEvent evt) { dispose();}/** 保存文件,生成的单词表写入到文件中,保存* */private void saveMenuItemActionPerformed(java.awt.event.ActionEvent evt) {checkInformation.saveInfos(recordChar,_CHAR);checkInformation.saveInfos(recordMessage,_MESSAGE);JOptionPane.showMessageDialog(this,"保存成功!","友情提示",JOptionPane.OK_OPTION,new ImageIcon("src//picture//open.gif"));}/***开始进行词法分析**/private void analyseFile(){//标记特殊字符char temp;int end;int flag=1; //列表标记行号char A = 'A';char Z = 'Z';char a = 'a';char z = 'z';char E = 'E';char e= 'e';char zero = '0';char nine = '9';char newLine = '\n';char dot = '.';char bottom = '_';charListTextArea.setText(null);charListTextArea.setText("序号记号单词备注 \n"); //置空字符表显示文本区StringBuffer analyseText=new StringBuffer(); //进行字符解析if (sourFile != null) {int len = sourceProgrammeTextArea.getText().length();System.out.println("len: "+len+"");char[] bufferArray = new char[len+1];bufferArray = sourceProgrammeTextArea.getText().toCharArray(); //将源文件中的字符串转成字符数组int i=0;//开始进行字符分析try{while(i< bufferArray.length){temp=bufferArray[i];/**keyWord and identifier will start with character*/if((temp>=A&&temp<=Z)||(temp>=a&&temp<=z)||(temp==bottom)){analyseText.delete(0,analyseText.length()); // 将可变字符串置空while((temp>=A&&temp<=Z)||(temp>=a&&temp<=z)||(temp==bottom)||(temp>=zero&& temp<=nine)){analyseText.append(temp);temp=bufferArray[++i];}charListTextArea.append( String.valueOf(flag++)+"\t\t"+checkWord(analyseText.to String())+"\t\t"+analyseText.toString().trim()+" \n");isCharExisted(analyseText.toString().trim(),checkWord(analyseText.toString().trim()));}/**if current char is a number,it will be numbers**/else if(temp>=zero&&temp<=nine){analyseText.delete(0,analyseText.length()); // 将可变字符串置空while(temp>=zero&&temp<=nine){analyseText.append(temp);temp=bufferArray[++i];}/**if the next char is dot,it will be float,elseit's integer,else It's exponent*/if (temp == dot){analyseText.append(temp);temp = bufferArray[++i];while ((temp >= zero) && (temp <= nine)){analyseText.append(temp);temp= bufferArray[++i];}/**If It's a exponent,just as2.36e+4*/if(temp==e||temp==E){analyseText.append(temp);temp= bufferArray[++i];if(temp=='+'||temp=='-'){analyseText.append(temp);temp= bufferArray[++i];}while((temp >= zero) && (temp <= nine)){analyseText.append(temp);temp= bufferArray[++i];}charListTextArea.append(String.valueOf(flag++) +"\t\tNUM\t\t" +analyseText.toString() +"\t\tEXPONENT\n");isCharExisted(analyseText.toString().trim(),"EXPONENT");}/**If It's a float*/else{charListTextArea.append(String.valueOf(flag++)+ "\t\tNUM\t\t" +analyseText.toString() +"\t\tFLOAT \n");isCharExisted(analyseText.toString().trim(),"FLOAT");}}/**If It's a exponent,just as2e+4*/else if(temp==e||temp==E){analyseText.append(temp);temp = bufferArray[++i];/**若当前指数的形式为:2e+4*/if(temp=='+'||temp=='-'){analyseText.append(temp);temp= bufferArray[++i];}while((temp >= zero) && (temp <= nine)){analyseText.append(temp);temp= bufferArray[++i];}charListTextArea.append(String.valueOf(flag++)+"\t\tNUM\t\t" +analyseText.toString() + "\t\tEXPONENT \n");isCharExisted(analyseText.toString().trim(),"EXPONENT"); //针对浮点数进行求值} //end of else of/**If It's a integer*/else{charListTextArea.append(String.valueOf(flag++) + "\t\tNUM\t\t" +analyseText.toString() +" \t\tINTEGER \n");isCharExisted(analyseText.toString().trim(),"INTEGER");} //end of else} //end of else/**If current char is'/',It maybe Notes*/else if(temp=='/'){analyseText.delete(0,analyseText.length()); // 将可变字符串置空analyseText.append(temp);temp=bufferArray[++i];if(temp=='/'){analyseText.append(temp);temp=bufferArray[++i];while(temp!=newLine){analyseText.append(temp);temp=bufferArray[++i];}temp=bufferArray[++i];}else if(temp=='*'){temp = bufferArray[++i];int count = 0;while (count != 2){count = 0;while (temp != '*'){temp = bufferArray[++i];}count++;temp= bufferArray[++i];if (temp == '/') {count++;}}temp= bufferArray[++i];}else {/***operator'/='*/if (temp == '=') {analyseText.append(temp);charListTextArea.append(String.valueOf(flag++)+" "+analyseText.toString()+ " "+analyseText.toString()+" " + " OPERATOR \n");isCharExisted(analyseText.toString().trim(),"OPERATOR");temp = bufferArray[++i];}else{charListTextArea.append(String.valueOf(flag++) +" "+analyseText.toString()+ " "+analyseText.toString()+" " +" OPERATOR \n");isCharExisted(analyseText.toString().trim(),"OPETATOR");}}} // end of else if/**identify other operators*/else{analyseText.delete(0, analyseText.length());/***identify other operator*识别其他的操作符号*/switch (temp){case'+':{analyseText.append(temp);temp = bufferArray[++i];if (temp == '='){analyseText.append(temp);charListTextArea.append(String.valueOf(flag++)+"\t\t"+analyseText.toString()+ "\t\t"+analyseText.toString()+"\tOPERATOR \n");temp= bufferArray[++i];}else if (temp == '+'){analyseText.append(temp);charListTextArea.append(String.valueOf(flag++)+"\t\t"+analyseText.toString()+ "\t\t"+analyseText.toString()+"\tOPERATOR \n");temp= bufferArray[++i];}else{charListTextArea.append(String.valueOf(flag++)+"\t\t"+analyseText.toString()+ "\t\t"+analyseText.toString()+"\tOPERATOR \n");}break;}case'-':{analyseText.append(temp);temp= bufferArray[++i];if (temp == '=') {analyseText.append(temp);charListTextArea.append(String.valueOf(flag++)+"\t\t"+analyseText.toString()+ "\t\t"+analyseText.toString()+"\tOPERATOR \n");temp= bufferArray[++i];}else if (temp == '-') {analyseText.append(temp);charListTextArea.append(String.valueOf(flag++)+"\t\t"+analyseText.toString()+ "\t\t"+analyseText.toString()+"\tOPERATOR \n");temp= bufferArray[++i];}else if(temp == '>'){analyseText.append(temp);charListTextArea.append(String.valueOf(flag++)+"\t\t"+analyseText.toString()+ "\t\t"+analyseText.toString()+"\tOPERATOR \n");temp= bufferArray[++i];}else{charListTextArea.append(String.valueOf(flag++)+"\t\t"+analyseText.toString()+ "\t\t"+analyseText.toString()+"\tOPERATOR \n");}break;}case'*':{analyseText.append(temp);temp= bufferArray[++i];if (temp == '='){analyseText.append(temp);charListTextArea.append(String.valueOf(flag++)+"\t\t"+analyseText.toString()+ "\t\t"+analyseText.toString()+"\tOPERATOR \n");temp= bufferArray[++i];}else {charListTextArea.append(String.valueOf(flag++)+"\t\t"+analyseText.toString()+ "\t\t"+analyseText.toString()+"\tOPERATOR \n");}break;}//取余运算case'%':{analyseText.append(temp);temp= bufferArray[++i];if (temp == '=') {analyseText.append(temp);charListTextArea.append(String.valueOf(flag++)+"\t\t"+analyseText.toString()+ "\t\t"+analyseText.toString()+"\tOPERATOR \n");temp= bufferArray[++i];}else {charListTextArea.append(String.valueOf(flag++)+"\t\t"+analyseText.toString()+ "\t\t"+analyseText.toString()+"\tOPERATOR \n");}break;}case'>':{analyseText.append(temp);temp= bufferArray[++i];if (temp == '='){analyseText.append(temp);charListTextArea.append(String.valueOf(flag++)+"\t\t"+analyseText.toString()+ "\t\t"+analyseText.toString()+"\tOPERATOR \n");temp= bufferArray[++i];}else{if (temp == '>'){analyseText.append(temp);charListTextArea.append(String.valueOf(flag++)+"\t\t"+analyseText.toString()+ "\t\t"+analyseText.toString()+"\tOPERATOR \n");temp= bufferArray[++i];} else {charListTextArea.append(String.valueOf(flag++)+"\t\t"+analyseText.toString()+ "\t\t"+analyseText.toString()+"\tOPERATOR \n");}}break;}case'<':{analyseText.append(temp);temp= bufferArray[++i];if (temp == '=') {analyseText.append(temp);charListTextArea.append(String.valueOf(flag++)+"\t\t"+analyseText.toString()+ "\t\t"+analyseText.toString()+"\tOPERATOR \n");temp= bufferArray[++i];} else {if (temp == '<') {charListTextArea.append(String.valueOf(flag++)+"\t\t"+analyseText.toString()+ "\t\t"+analyseText.toString()+"\tOPERATOR \n");temp= bufferArray[++i];} else {charListTextArea.append(String.valueOf(flag++)+"\t\t"+analyseText.toString()+ "\t\t"+analyseText.toString()+"\tOPERATOR \n");}}break;}// 不等运算case'!':{analyseText.append(temp);temp= bufferArray[++i];if (temp == '=') {analyseText.append(temp);charListTextArea.append(String.valueOf(flag++)+"\t\t"+analyseText.toString()+ "\t\t"+analyseText.toString()+"\tOPERATOR \n");temp= bufferArray[++i];} else {charListTextArea.append(String.valueOf(flag++)+"\t\t"+analyseText.toString()+ "\t\t"+analyseText.toString()+"\tOPERATOR \n");}break;}//与运算case'&':{analyseText.append(temp);temp= bufferArray[++i];if (temp == '&') {analyseText.append(temp);charListTextArea.append(String.valueOf(flag++)+"\t\t"+analyseText.toString()+ "\t\t"+analyseText.toString()+"\tOPERATOR \n");temp= bufferArray[++i];} else {if (temp == '=') {analyseText.append(temp);charListTextArea.append(String.valueOf(flag++)+"\t\t"+analyseText.toString()+ "\t\t"+analyseText.toString()+"\tOPERATOR \n");temp= bufferArray[++i];} else {charListTextArea.append(String.valueOf(flag++)+"\t\t"+analyseText.toString()+ "\t\t"+analyseText.toString()+"\tOPERATOR \n");}}break;}// 或运算case'|':{analyseText.append(temp);temp= bufferArray[++i];if (temp == '|') {analyseText.append(temp);charListTextArea.append(String.valueOf(flag++)+"\t\t"+analyseText.toString()+ "\t\t"+analyseText.toString()+"\tOPERATOR \n");temp= bufferArray[++i];} else {if (temp == '=') {analyseText.append(temp);charListTextArea.append(String.valueOf(flag++)+"\t\t"+analyseText.toString()+ "\t\t"+analyseText.toString()+"\tOPERATOR \n");temp= bufferArray[++i];} else {charListTextArea.append(String.valueOf(flag++)+"\t\t"+analyseText.toString()+ "\t\t"+analyseText.toString()+"\tOPERATOR \n");}}break;}// equalcase'=':{analyseText.append(temp);temp= bufferArray[++i];if (temp == '=') {analyseText.append(temp);charListTextArea.append(String.valueOf(flag++)+"\t\t"+analyseText.toString()+ "\t\t"+analyseText.toString()+"\tOPERATOR \n");temp= bufferArray[++i];} else {charListTextArea.append(String.valueOf(flag++)+"\t\t"+analyseText.toString()+ "\t\t"+analyseText.toString()+"\tOPERATOR \n");}break;}//位运算case'^':{analyseText.append(temp);temp= bufferArray[++i];if (temp == '=') {analyseText.append(temp);charListTextArea.append(String.valueOf(flag++)+"\t\t"+analyseText.toString()+ "\t\t"+analyseText.toString()+"\tOPERATOR \n");temp= bufferArray[++i];} else {charListTextArea.append(String.valueOf(flag++)+"\t\t"+analyseText.toString()+ "\t\t"+analyseText.toString()+"\tOPERATOR \n");}break;}case'"':{analyseText.append(temp);charListTextArea.append(String.valueOf(flag++)+"\t\t"+analyseText.toString()+ "\t\t"+analyseText.toString()+"\tOPERATOR \n");temp= bufferArray[++i];break;}case',':{analyseText.append(temp);charListTextArea.append(String.valueOf(flag++)+"\t\t"+analyseText.toString()+ "\t\t"+analyseText.toString()+"\tOPERATOR \n");temp= bufferArray[++i];break;}case';':{analyseText.append(temp);charListTextArea.append(String.valueOf(flag++)+"\t\t"+analyseText.toString()+ "\t\t"+analyseText.toString()+"\tOPERATOR \n");temp= bufferArray[++i];break;}case'(':{analyseText.append(temp);charListTextArea.append(String.valueOf(flag++)+"\t\t"+analyseText.toString()+ "\t\t"+analyseText.toString()+"\tOPERATOR \n");temp= bufferArray[++i];break;}case')':{analyseText.append(temp);charListTextArea.append(String.valueOf(flag++)+"\t\t"+analyseText.toString()+ "\t\t"+analyseText.toString()+"\tOPERATOR \n");temp= bufferArray[++i];break;}case'{':{analyseText.append(temp);charListTextArea.append(String.valueOf(flag++)+"\t\t"+analyseText.toString()+ "\t\t"+analyseText.toString()+"\tOPERATOR \n");temp= bufferArray[++i];break;}case'}':{analyseText.append(temp);charListTextArea.append(String.valueOf(flag++)+"\t\t"+analyseText.toString()+ "\t\t"+analyseText.toString()+"\tOPERATOR \n");temp= bufferArray[++i];break;}case'[':{analyseText.append(temp);charListTextArea.append(String.valueOf(flag++)+"\t\t"+analyseText.toString()+ "\t\t"+analyseText.toString()+"\tOPERATOR \n");temp= bufferArray[++i];break;}case']':{analyseText.append(temp);charListTextArea.append(String.valueOf(flag++)+"\t\t"+analyseText.toString()+ "\t\t"+analyseText.toString()+"\tOPERATOR \n");temp= bufferArray[++i];break;}case'\'':{analyseText.append(temp);temp= bufferArray[++i];while (temp != '\'') {analyseText.append(temp);temp= bufferArray[++i];}analyseText.append(temp);charListTextArea.append(String.valueOf(flag++)+"\t\t"+analyseText.toString()+ "\t\t"+analyseText.toString()+"\tOPERATOR \n");temp= bufferArray[++i];break;}case'.':{analyseText.append(temp);charListTextArea.append(String.valueOf(flag++)+"\t\t"+analyseText.toString()+ "\t\t"+analyseText.toString()+"\tOPERATOR \n");temp= bufferArray[++i];break;}case'#':{analyseText.append(temp);charListTextArea.append(String.valueOf(flag++)+"\t\t"+analyseText.toString()+ "\t\t"+analyseText.toString()+"\tOPERATOR \n");temp= bufferArray[++i];break;}case' ':case'\n':case'\r':case'\t':temp= bufferArray[++i];break;default:{analyseText.append(temp);if(!analyseText.toString().trim().equals(" ")){charListTextArea.append(String.valueOf(flag++)+"\t\t"+analyseText.toString()+"\t\t"+analyseText.toString()+"\t ERROR \n");}temp= bufferArray[++i];break;}}// end switchisCharExisted(analyseText.toString().trim(),analyseText.toString().trim());}} //end of while} catch(ArrayIndexOutOfBoundsException err){charListTextArea.append("\n");}}}/** 生成标识符表* */public void tokenFile(){int flag=1;identifierTextArea.setText(null);identifierTextArea.setText("序号记号单词备注 \n"); //置空字符表显示文本区for(int i=0;i<recordChar.size();i++){if(i!=2) // mistake{identifierTextArea.append(String.valueOf(flag++)+"\t\t"+recordMessage.get(i)+"\t\t"+recordChar.get(i)+"\n");}}}/** 检查关键字* */private String checkWord(String word) {/** C 语言中的32个关键字*/String keyWord[] = new String[]{ "auto", "break", "case", "char", "const", "continue","default", "do", "double", "else", "enum", "extern", "float","for", "goto", "if", "int", "long", "register", "return","short", "signed", "sizeof", "static", "struct", "switch","typedef", "union", "unsigned", "void", "volatile", "while" };/** C 语言中 12个预定义符*/String pretreatment[] = new String[]{"define","endif","elif","error","line","include","ifdef","ifndef","pragma","undef","if","else"};for (int i = 0; i < 32; i++) {if (word.trim().equals(keyWord[i]))return"KEY";}for (int i = 0; i < 12; i++) {if (word.trim().equals(pretreatment[i]))return"PREM";}return"ID";}/***检验当前的单词是否已存在于单词表中,true跳过false扩充至单词表中**/private void isCharExisted(String temp,String message){System.out.println("当前的单词为:"+temp+"单词信息为:"+message+"\n");int length=recordChar.size();boolean flag=false;if(length!=0){for(int i=0;i<length;i++){if(recordChar.get(i).equals(temp)){flag=true;break;}}}if(flag==false){recordChar.add(temp);recordMessage.add(message);}}/***针对指数进行数值转换**/// public double change(String str)// {// int len=str.length();// char analyse[]=new char[len+1];// analyse=str.toCharArray();// return 0;// }/***@param args the command line arguments*/public static void main(String args[]) {java.awt.EventQueue.invokeLater(new Runnable() { public void run() {new analyseTest().setVisible(true);}});}/***变量声明区**/private javax.swing.JMenuBar MenuBar;private javax.swing.JMenu aboutMenu;private javax.swing.JMenuItem beginMenuItem;private javax.swing.JLabel charListLabel;private java.awt.TextArea charListTextArea;private javax.swing.JMenu compilerMenu;private javax.swing.JMenuItem exitMenuItem;。

java词法解析

java词法解析

java词法解析
词法分析是编译过程的第一个阶段,是编译的基础。

这个阶段的任务是从左到右一个字符一个字符地读入源程序,即对构成源程序的字符流进行扫描,然后根据构词规则识别单词(也称单词符号或符号)。

词法分析程序可以使用Lex等工具自动生成。

在java中,可以通过定义Scanner类和Token枚举类来实现词法分析。

Scanner类负责对输入的字符串进行遍历,分割成有意义的Tokens。

Token枚举类则承担辨识字符类型的工作,同时存储Token的类型和值。

执行词法分析的程序称为词法分析器,也称为扫描器。

词法分析是所有分析优化的基础,涉及的知识较少,如状态转换图等,易于实现。

编译原理词法分析器java

编译原理词法分析器java

实验一词法分析器的设计一、实验目的1.理解词法分析器的任务和输出形式2.理解扫描器的工作原理3.掌握状态转换图的绘制以及单词的识别技术4.掌握词法分析器的设计过程,能够使用某种高级语言实现一个词法分析器二、实验环境Myeclipse三、实验要求给出一个简单的词法语言规则描述,其中:1开头的种别码为关键词,2开头的为算符,3开头的为界符,4开头的为标识符,5开头的为常数,标识符为字母开头,以字母和数字组成的任意符号串,常数为整数,即以数字组成的符号串。

四、实验难点1.对整数的二进制转换,以及对指针的操作2.标识符的设置五、实验代码1.ciFa.Javapackage 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.Javapackage com.yaoer.test1;public class compiler {public String computerComp(String str){String output="";int index=0;int k = 0;while(index<str.length()){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+" 数字)");}return output;}}if(isLetter(str.charAt(index))){if(str.charAt(index)==' '||str.charAt(index)=='\n'){//空格或者回车处理index++;}while((!isMath(str.charAt(index)))||(isLetter(str.charAt(index)))){output+=(str.charAt(index));index++;if(index>=str.length()) {output+=(" 非标识符)");return output;}}output+=(" 非法字符)");}else{if(str.charAt(index1)=='0'){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+" 数字)");}}}else if(isLetter(str.charAt(index))){ //标识符判断int i=index;String sub;while(isLetter(str.charAt(index))||isMath(str.charAt(index))){index++;if(index>=str.length()){//System.out.println(index);sub =str.substring(i, index);if(isKeyword(sub)!=0){if(isKeyword(sub)>=10){output+=("( "+" 1"+isKeyword(sub)+" "+sub+" 关键字)");}else{output+=("( "+" 10"+isKeyword(sub)+" "+sub+" 关键字)");}}else{output+=("( "+sub+" 标识符)");}return output;}}sub = str.substring(i, index);//判断是不是关键字if(isKeyword(sub)!=0){if(isKeyword(sub)>=10){output+=("( "+" 1"+isKeyword(sub)+" "+sub+" 关键字)");}else{output+=("( "+" 10"+isKeyword(sub)+" "+sub+" 关键字)");}}else{output+=("("+sub+" 标识符)");}}else if(isCompu(str.charAt(index))!=0){if(index+1>=str.length()){if(str.charAt(index)=='&'||str.charAt(index)=='|'){output+=("("+str.charAt(index)+" 非法字符)");index++;}else{if(isCompu(str.charAt(index))<=8){output+=("("+" 20"+isCompu(str.charAt(index))+" "+str.charAt(index)+" 运算符)");}else if(str.charAt(index)=='!'){output+=("( 218 "+str.charAt(index)+" 运算符)");}index++;}}else{if(isCompu(str.charAt(index+1))==0){if(str.charAt(index)=='&'||str.charAt(index)=='|'){output+=("("+str.charAt(index)+" 非法字符)");index++;}else{if(isCompu(str.charAt(index))<=8){output+=("("+"20"+isCompu(str.charAt(index))+" "+str.charAt(index)+" 运算符)");}else if(str.charAt(index)=='!'){output+=("("+" 218"+str.charAt(index)+" 运算符)");}index++;}}else{if(index+2>=str.length()){if( isCompu(str.charAt(index+1))!=0){if(str.charAt(index)=='='){if(str.charAt(index+1)=='='){output+=("("+" 210 "+str.charAt(index)+str.charAt(index+1)+" 运算符)");index++;index++;}else{output+=("("+str.charAt(index)+str.charAt(index+1)+" 非法字符)");index++;index++;}}else if(str.charAt(index)=='<' ){switch (str.charAt(index+1)) {case '=':output+=("("+" 209 "+str.charAt(index)+str.charAt(index+1)+" 运算符)");index++;index++;break;case '<':output+=("( 215 "+str.charAt(index)+str.charAt(index+1)+" 运算符)");index++;index++;break;case '>':output+=("( 211 "+str.charAt(index)+str.charAt(index+1)+" 运算符)");index++;index++;break;default:output+=("("+str.charAt(index)+str.charAt(index+1)+" 非法字符)");index++;index++;break;}}else if(str.charAt(index)=='>' ){if(str.charAt(index+1)=='='){output+=("( 207 "+str.charAt(index)+str.charAt(index+1)+" 运算符)");index++;index++;}else if(str.charAt(index+1)=='>'){output+=("( 214 "+str.charAt(index)+str.charAt(index+1)+" 运算符)");index++;index++;}else{output+=("("+str.charAt(index)+str.charAt(index+1)+" 非法字符)");index++;index++;}}else if(str.charAt(index)=='&'){if(str.charAt(index+1)=='&'){output+=("( 216 "+str.charAt(index)+str.charAt(index+1)+" 运算符)");index++;index++;}else{output+=("("+str.charAt(index)+str.charAt(index+1)+" 非法字符)");index++;index++;}}else if(str.charAt(index)=='|'){if(str.charAt(index+1)=='|'){output+=("( 217 "+str.charAt(index)+str.charAt(index+1)+" 运算符)");index++;index++;}else{output+=("("+str.charAt(index)+str.charAt(index+1)+" 非法字符)");index++;index++;}}else if(str.charAt(index)=='+'){if(str.charAt(index+1)=='+'){output+=("( 212 "+str.charAt(index)+str.charAt(index+1)+" 运算符)");index++;index++;}else{output+=("("+str.charAt(index)+str.charAt(index+1)+" 非法字符)");index++;index++;}}else if(str.charAt(index)=='-'){if(str.charAt(index+1)=='-'){output+=("( 213 "+str.charAt(index)+str.charAt(index+1)+" 运算符)");index++;index++;}else{output+=("("+str.charAt(index)+str.charAt(index+1)+" 非法字符)");index++;index++;}}else{output+=("("+str.charAt(index)+str.charAt(index+1)+" 非法字符)");index++;index++;}}return output;}else{if( isCompu(str.charAt(index+1))!=0){if(str.charAt(index)=='='){if(str.charAt(index+1)=='='){output+=("("+" 210 "+str.charAt(index)+str.charAt(index+1)+" 运算符)");index++;index++;}else{output+=("("+str.charAt(index)+str.charAt(index+1)+" 非法字符)");index++;index++;}}else if(str.charAt(index)=='<' ){switch (str.charAt(index+1)) {case '=':output+=("("+" 209 "+str.charAt(index)+str.charAt(index+1)+" 运算符)");index++;index++;break;case '<':output+=("("+" 215 "+str.charAt(index)+str.charAt(index+1)+" 运算符)");index++;index++;break;case '>':output+=("( 211 "+str.charAt(index)+str.charAt(index+1)+" 运算符)");index++;index++;break;default:output+=("("+str.charAt(index)+str.charAt(index+1)+" 非法字符)");index++;index++;break;}}else if(str.charAt(index)=='>' ){if(str.charAt(index+1)=='='){output+=("( 207 "+str.charAt(index)+str.charAt(index+1)+" 运算符)");index++;index++;}else if(str.charAt(index+1)=='>'){output+=("( 214 "+str.charAt(index)+str.charAt(index+1)+" 运算符)");index++;index++;}else{output+=("("+str.charAt(index)+str.charAt(index+1)+" 非法字符)");index++;index++;}}else if(str.charAt(index)=='&'){if(str.charAt(index+1)=='&'){output+=("( 216 "+str.charAt(index)+str.charAt(index+1)+" 运算符)");index++;index++;}else{output+=("("+str.charAt(index)+str.charAt(index+1)+" 非法字符)");index++;index++;}}else if(str.charAt(index)=='|'){if(str.charAt(index+1)=='|'){output+=("( 217 "+str.charAt(index)+str.charAt(index+1)+" 运算符)");index++;index++;}else{output+=("("+str.charAt(index)+str.charAt(index+1)+" 非法字符)");index++;index++;}}else if(str.charAt(index)=='+'){if(str.charAt(index+1)=='+'){output+=("( 212"+str.charAt(index)+str.charAt(index+1)+" 运算符)");index++;index++;}else{output+=("("+str.charAt(index)+str.charAt(index+1)+" 非法字符)");index++;index++;}}else if(str.charAt(index)=='-'){if(str.charAt(index+1)=='-'){output+=("( 213 "+str.charAt(index)+str.charAt(index+1)+" 运算符)");index++;index++;}else{output+=("("+str.charAt(index)+str.charAt(index+1)+" 非法字符)");index++;index++;}}else{output+=("("+str.charAt(index)+str.charAt(index+1)+" 非法字符)");index++;index++;}}}}}}else if(str.charAt(index)==' '||str.charAt(index)=='\n'){//空格或者回车处理index++;}else {//其他字符output+=("("+str.charAt(index)+" 非法字符)");index++;}k++;if(k%10==0){output+=("\n");}}return output;}/*** 1.判断是不是关键字* @param str* @return*/public int isKeyword(String str){int result = 0;String[]arr={"void","main","int","char","if","else","for","while","return","cout","ci n"} ;for(int i=0;i<arr.length;i++){if(str.equals(arr[i])){result = i+1;break;}else {result = 0;}}return result;}/*** 2.判断是不是运算符* @param charr* @return*/public int isCompu(char charr) {char arr[]={'+','-','*','/','=','>','&','<','!','|'};for(int i=0;i<arr.length;i++) {if (charr==arr[i]){return i+1;}}return 0;}/*** 3.判断是不是界符* @param charr* @return*/public int isJieFu(char charr){char arr[]={'(',')','[',']','{','}',',',';'};for(int i=0;i<arr.length;i++){if (charr==arr[i]){return i+1;}}return -1;}/*** 4.判断是不是标识符* @param charr* @return*/public boolean isLetter(char charr){if(((charr>='a'&&charr<='z')||(charr>='A'&&charr<='Z')) ||charr=='_'){ return true;}else{return false;}}/*** 5.判断是不是数字* @param charr* @return*/public boolean isMath(char charr){if((charr>='0')&&(charr<='9')){return true;}else{return false;}}/*** 将十进制转换为二进制* @param num* @return*/public String Zhuan(String num){int number = Integer.parseInt(num);int sum;String result = "";for (int i = number; i >= 1; i /= 2) {if (i % 2 == 0) {sum = 0;} else {sum = 1;}result = sum + result;}return result;}}六、实验中遇到的问题及感想在编写词法分析器的程序中,几个子函数的功能还是比较容易实现的,但是要把它们的功能连在一起,实现对程序源代码的词法分析就困难了,例如在分析运算符的时候,有的运算符是由2个符号组成的,有的是1个,在读入一个字符的时候还要进行超前搜索,看看第二个字符是否可以和第一个字符组成一个运算符。

evaluator原理

evaluator原理

evaluator原理一、什么是evaluator在编程领域,evaluator是一个用于评估、判断和打分代码的工具或系统。

它可以根据给定的标准对代码进行全面、详细、完整地评估,并给出相应的分数或反馈。

evaluator不仅可以用于代码质量评估,还可用于性能评估、安全评估等方面。

本文将探讨evaluator的原理以及其在代码评估中的应用。

二、evaluator的原理1. 代码解析在对代码进行评估之前,evaluator首先需要将代码进行解析。

解析的过程可以分为词法分析和语法分析两个阶段。

词法分析词法分析是指将代码拆分成一个个词法单元(token)的过程。

词法单元可以是关键字、标识符、操作符、分隔符等等。

词法分析器会按照一定的规则,将代码拆分成不同的词法单元,并生成相应的token序列。

语法分析语法分析是指根据代码的词法单元序列构建抽象语法树(Abstract Syntax Tree,AST)的过程。

语法分析器会根据语法规则,对词法单元序列进行分析,构建出一棵表示代码结构的语法树。

2. 评估标准与规则评估者需要基于一定的标准和规则对代码进行评估。

评估标准可以是代码的质量、性能、安全性等方面的要求,规则可以是代码风格要求、最佳实践等。

评估标准和规则可以由评估者事先定义,也可以参考行业标准和规范。

3. 代码静态分析evaluator会对代码进行静态分析。

静态分析是指在不实际运行代码的情况下,通过分析代码的结构、语义和上下文,来判断代码的质量和问题。

静态分析可以帮助评估者找出潜在的问题、漏洞和优化点。

静态分析可以包括以下内容:代码规范检查evaluator可以检查代码是否符合事先定义的代码规范。

代码规范可以包括代码缩进、命名规范、代码布局等方面的要求。

通过检查代码规范,可以提高代码的可读性和可维护性。

代码质量评估evaluator可以对代码的质量进行评估。

评估的内容可以包括代码的复杂度、重复代码、代码冗余、代码结构等方面的指标。

javaparser 介绍

javaparser 介绍

javaparser 介绍【原创版】目录1.JavaParser 简介2.JavaParser 的功能3.JavaParser 的使用示例4.JavaParser 的优势与不足正文1.JavaParser 简介JavaParser 是一个用于解析 Java 源代码的开源库。

它可以将 Java 源代码解析成抽象语法树(Abstract Syntax Tree,AST),从而方便开发者对代码进行分析、生成、重构等操作。

JavaParser 本质上是一个 Java 语言的词法分析器和语法分析器,它遵循 Java 语言的语法规范,将源代码转换成结构化的数据模型。

2.JavaParser 的功能JavaParser 具有以下主要功能:- 将 Java 源代码解析成抽象语法树(AST)- 支持 Java 5、Java 6、Java 7 和 Java 8 等多个版本的语法规范- 可以解析类、方法、变量、注释等各种 Java 语言结构- 支持自定义词法分析器和语法分析器3.JavaParser 的使用示例下面是一个简单的 JavaParser 使用示例:```javaimport JavaParser.ParserFactory;import JavaParser.ast.AST;import pilationUnit;public class Main {public static void main(String[] args) {try {ParserFactory factory =ParserFactory.newFactory();CompilationUnit unit = factory.create(new FileReader("test.java"));AST ast = unit.parse();System.out.println(ast.toStringTree(ast.getRoot()));} catch (Exception e) {e.printStackTrace();}}}```在这个示例中,我们首先创建一个 ParserFactory 实例,然后使用该实例创建一个 CompilationUnit 对象。

java stanfordcorenlp 例子

java stanfordcorenlp 例子

自从Stanford University开发了Stanford CoreNLP这个自然语言处理工具包以来,它已经成为了许多开发者和研究人员在自然语言处理领域的首选工具之一。

在本文中,我将深入探讨Stanford CoreNLP的基本概念、功能和应用,并通过一些具体的例子来展示其强大的能力。

1. Stanford CoreNLP简介Stanford CoreNLP是一套基于Java语言开发的自然语言处理工具包,它提供了一系列强大的NLP工具,包括词法分析、语法分析、命名实体识别、情感分析等功能。

其功能丰富且易于使用的特点,使得它在文本处理、信息提取、情感分析等领域得到了广泛的应用。

2. 使用Stanford CoreNLP进行词法分析词法分析是NLP领域的基本任务之一,它主要包括词汇的分词、词性标注等功能。

我们可以使用Stanford CoreNLP提供的接口来进行词法分析,并获得句子中每个词的词性、原型等信息。

对于句子“我爱自然语言处理”,使用Stanford CoreNLP可以得到“我”是代词,爱是动词,自然语言处理是名词短语等信息。

3. 利用Stanford CoreNLP进行语法分析除了词法分析之外,Stanford CoreNLP还可以进行语法分析,帮助我们理解句子的句法结构。

通过语法分析,可以得到句子中词语之间的依存关系、成分结构等信息。

举个例子,对于句子“自然语言处理是一门重要的技术”,语法分析可以帮助我们理解“自然语言处理”是主语,“是”是连系动词,一门重要的技术”是宾语等信息。

4. 使用Stanford CoreNLP进行命名实体识别在许多NLP任务中,识别文本中的命名实体是非常重要的一个步骤。

Stanford CoreNLP提供了命名实体识别的功能,可以快速准确地识别文本中的人名、地名、组织机构名等信息。

对于句子“乔布斯是苹果公司的创始人”,命名实体识别可以帮助我们识别“乔布斯”是人名,“苹果公司”是组织机构名等信息。

java实现的词法分析

java实现的词法分析
3.2关键算法流程图及文字解释
词法分析程序(Analysis函数)详细流程图如下:
voidanalysis()throwsException
{
StringBuffer lexSegment=newStringBuffer();
StringBuffer digitSegment=newStringBuffer();
isFinished=true;
continue;
}
elseif(now.equals('.'))
{
signal.append("运算符",symbol[5],1,signal.binaryTeamLengthUsed);
isFinished=true;
continue;
}
elseif(now.equals(':'))
{
signal.append("运算符",symbol[11],1,signal.binaryTeamLengthUsed);
isFinished=true;
continue;
}
else
{
signal.append("运算符",symbol[8],1,signal.binaryTeamLengthUsed);
{
column++;
if(program.charAt(column)=='=')
{
signal.append("运算符",symbol[6],1,signal.binaryTeamLengthUsed);
isFinished=true;
continue;

JavaCC基本使用介绍

JavaCC基本使用介绍

JavaCC基本使用介绍————————————————————————————————作者:————————————————————————————————日期:JavaCC基本使用介绍目录一、引言 (4)1.1 JavaCC简介: (4)1.2 词法分析器概念 (4)1.3 语法分析器概念 (5)1.4 JavaCC采取的语法分析方法 (5)二、示例使用流程 (8)2.1加法解析器 (8)2.2 扩展的加法解析器 (12)2.3 计算器解析器 (14)2015年1月2日星期五一、引言1.1 JavaCC简介:JavaCC(Java Compiler Compiler)是一个用JA V A开发的能生成词法和语法分析器的工具。

这个工具可以读取上下文无关且有着特殊意义语法的文本输入并把它转换成可以识别该语法的JA V A程序。

JavaCC可以在JVM 1.2或更高的版本上使用,它由纯Java代码开发,可以在多种平台上运行。

JavaCC还提供JJTree工具来帮助我们建立语法树,JJDoc工具为我们的源文件生成BNF范式(巴科斯-诺尔范式)文档(Html)。

1.2 词法分析器概念词法分析器又称扫描器。

词法分析是指将我们编写的文本输入流解析为一个个的记号(Token),分析得到的记号以供后续语法分析使用。

词法分析器的工作是低级别的分析,就是将一系列字符分成一个个的Token,并标记Token的分类。

例如:输入:int main() {return 0;}输出:“int”, “ ”, “main”, “(”, “)”, “ ”, “{”, “\n”, “\t”, “return”, “ ”, “0”, “;”, “\n”, “}”工作流程如图1所示:图1:词法分析器工作流程1.3 语法分析器概念语法分析(Syntacticanalysis or Parsing)是根据某种给定的形式文法对由单词序列构成的输入文本进行分析并确定其语法结构的一种过程。

java antlr语法

java antlr语法

Java ANTLR语法1. 介绍在Java编程中,ANTLR(ANother Tool for Language Recognition)是一种非常有用的工具,用于构建语法分析器。

它可以根据给定的语法规则生成解析器和词法分析器,并且可以应用于生成代码、进行语法检查、执行语义分析等多个领域。

2. ANTLR的基本原理ANTLR的基本原理是使用上下文无关文法(Context-Free Grammar,简称CFG)描述语言的语法规则,并根据这些规则生成解析器和词法分析器。

ANTLR支持LL()语法和LR()语法两种类型,并可以通过语法规则的定义灵活地生成不同类型的解析器。

2.1 上下文无关文法上下文无关文法是一种形式化的语法规范,用于描述一类形式语言的句法结构。

它包含四个部分:终结符(Terminals)、非终结符(Non-terminals)、产生式规则(Productions)和起始符(Start symbol)。

ANTLR使用扩展的巴科斯范式(Extended Backus-Naur Form,简称EBNF)来描述上下文无关文法。

2.2 语法规则定义在ANTLR中,语法规则由标识符、参数列表、返回类型和规则体四个部分组成。

语法规则的定义基本形式如下:ruleName [返回类型] [参数列表]: 执行体;其中,ruleName表示规则名称,返回类型和参数列表可选。

执行体是规则的具体实现,用于描述规则的语义。

2.3 解析器和词法分析器的生成在ANTLR中,通过定义完整的语法规则,并使用ANTLR工具根据这些规则生成解析器和词法分析器。

生成的解析器和词法分析器可以直接应用于源代码的解析和语法检查。

3. ANTLR语法规则示例下面是一个简单的ANTLR语法规则示例,用于解析简单的数学表达式:grammar MathExpression;// 语法规则start : expression EOF;expression : expression op=('*' | '/')| expression op=('+' | '-')| '(' expression ')'| NUMBER;// 词法规则NUMBER : DIGIT+;WS : [ \t\n\r]+ -> skip;// 辅助规则fragment DIGIT : [0-9];4. ANTLR语法规则说明上述示例中,定义了一个名为MathExpression的语法规则,用于解析简单的数学表达式。

词法分析器实验报告_5

词法分析器实验报告_5

一、实验目的1.1总体目的1.1.1 掌握词法分析的基本原理;1.1.2.理解词法分析在编译程序过程中的作用;1.1.3.熟悉关键字表等相关的数据结构与单词的分类方法.1.1.4.加深对编译原理的理解,掌握词法分析器的实现方法和技术,同时,将JA V A 的理论知识结合实际,锻炼编程技术,强调良好的程序设计风格。

1.2程序目的利用JAVA语言针对C语言编制一个一遍扫描的编译程序。

从文件中识别出各个单词, 识别出所取的单词的类型, 并且对代码中的词法错误进行提示。

二、实验内容根据编译原理中的词法分析原理, 利用Java语言针对C语言编写一个词法分析程序: 输入: 打开一个C语言程序的源代码文件, 将其读入程序输入框。

处理: 对输入框中的代码进行词法分析,分离出关键字、标识符、数值、运算符和界符。

输出:在词法分析结果表中输出每个单词所在行号、类型以及它所对应的编码。

其中, 编码是自定义的,一种类型对应一组编码。

词法分析结果显示在词法分析错误信息栏, 提示错误个数、错误所在行号, 并对某些词法错误原因进行说明。

三、实验需求针对C语言程序代码进行词法分析器, 从指定文件中读入预分析的源程序, 从左至右扫描源程序的字符串, 按照词法规则(正则文法规则)识别出一个个正确的单词, 并转换成该单词相应的二元式(种别码、属性值)以便之后进行语法分析使用。

同时, 按照给定的规则, 识别出单词符号作为输出, 发现其中的语法错误, 不同类别的字符通过相应的函数模块来分析识别, 使程序能够正确识别文法所规定的任何组织形式的字符组合, 将所有的分析状态显示在词法分析器中。

最后在错误分析栏中显示该文件中C语言代码的词法错误个数、错误所在行, 并对错误原因进行说明。

四、主要数据结构介绍4.1关键字编码4.2标识符统一编码1004.3数值统一编码2004.4界符编码4.5运算符编码4.6全局变量含义int row: 语法错误出现的所在列数int line: 语法错误出现的所在行数int err: 语法错误的个数int begin: 当前程序扫描在字符串中的开始位置int end: 当前程序扫描在字符串中的结束位置4.7局部变量定义int i: 选择第i 个字符进行检测 int state: 单词类型判断标志 int N: 文件长度char c: 当前遍历的字符 string str: 输入字符串 int flag: 退出标志五、主要模块算法介绍5.1总体流程介绍说明: state 为输入字符状态标志, 根据输入字符不同类型选择不同处理。

利用Java实现简单的词法分析器实例代码

利用Java实现简单的词法分析器实例代码

利⽤Java实现简单的词法分析器实例代码⾸先看下我们要分析的代码段如下:输出结果如下:输出结果(a).PNG输出结果(b).PNG输出结果(c).PNG括号⾥是⼀个⼆元式:(单词类别编码,单词位置编号)代码如下:package Yue.LexicalAnalyzer;import java.io.*;/** 主程序*/public class Main {public static void main(String[] args) throws IOException {Lexer lexer = new Lexer();lexer.printToken();lexer.printSymbolsTable();}}package Yue.LexicalAnalyzer;import java.io.*;import java.util.*;/** 词法分析并输出*/public class Lexer {/*记录⾏号*/public static int line = 1;/*存放最新读⼊的字符*/char character = ' ';/*保留字*/Hashtable<String, KeyWord> keywords = new Hashtable<String, KeyWord>();/*token序列*/private ArrayList<Token> tokens = new ArrayList<Token>();/*符号表*/private ArrayList<Symbol> symtable = new ArrayList<Symbol>();/*读取⽂件变量*/BufferedReader reader = null;/*保存当前是否读取到了⽂件的结尾*/private Boolean isEnd = false;/* 是否读取到⽂件的结尾 */public Boolean getReaderState() {return this.isEnd;}/*打印tokens序列*/public void printToken() throws IOException {FileWriter writer = new FileWriter("E:\\lex.txt");System.out.println("词法分析结果如下:");System.out.print("杜悦-2015220201031\r\n\n");writer.write("杜悦-2015220201031\r\n\r\n");while (getReaderState() == false) {Token tok = scan();String str = "line " + tok.line + "\t(" + tok.tag + "," + tok.pos + ")\t\t"+ + ": " + tok.toString() + "\r\n";writer.write(str);System.out.print(str);}writer.flush();}/*打印符号表*/public void printSymbolsTable() throws IOException {FileWriter writer = new FileWriter("E:\\symtab1.txt");System.out.print("\r\n\r\n符号表\r\n");System.out.print("编号\t⾏号\t名称\r\n");writer.write("符号表\r\n");writer.write("编号 " + "\t⾏号 " + "\t名称 \r\n");Iterator<Symbol> e = symtable.iterator();while (e.hasNext()) {Symbol symbol = e.next();String desc = symbol.pos + "\t" + symbol.line + "\t" + symbol.toString(); System.out.print(desc + "\r\n");writer.write(desc + "\r\n");}writer.flush();}/*打印错误*/public void printError(Token tok) throws IOException{FileWriter writer = new FileWriter("E:\\error.txt");System.out.print("\r\n\r\n错误词法如下:\r\n");writer.write("错误词法如下:\r\n");String str = "line " + tok.line + "\t(" + tok.tag + "," + tok.pos + ")\t\t"+ + ": " + tok.toString() + "\r\n";writer.write(str);}/*添加保留字*/void reserve(KeyWord w) {keywords.put(w.lexme, w);}public Lexer() {/*初始化读取⽂件变量*/try {reader = new BufferedReader(new FileReader("E:\\输⼊.txt"));} catch (IOException e) {System.out.print(e);}/*添加保留字*/this.reserve(KeyWord.begin);this.reserve(KeyWord.end);this.reserve(KeyWord.integer);this.reserve(KeyWord.function);this.reserve(KeyWord.read);this.reserve(KeyWord.write);this.reserve(KeyWord.aIf);this.reserve(KeyWord.aThen);this.reserve(KeyWord.aElse);}/*按字符读*/public void readch() throws IOException {character = (char) reader.read();if ((int) character == 0xffff) {this.isEnd = true;}}/*判断是否匹配*/public Boolean readch(char ch) throws IOException {readch();if (this.character != ch) {return false;}this.character = ' ';return true;}/*数字的识别*/public Boolean isDigit() throws IOException {if (Character.isDigit(character)) {int value = 0;while (Character.isDigit(character)) {value = 10 * value + Character.digit(character, 10); readch();}Num n = new Num(value);n.line = line;tokens.add(n);return true;} elsereturn false;}/*保留字、标识符的识别*/public Boolean isLetter() throws IOException {if (Character.isLetter(character)) {StringBuffer sb = new StringBuffer();/*⾸先得到整个的⼀个分割*/while (Character.isLetterOrDigit(character)) {sb.append(character);readch();}/*判断是保留字还是标识符*/String s = sb.toString();KeyWord w = keywords.get(s);/*如果是保留字的话,w不应该是空的*/if (w != null) {w.line = line;tokens.add(w);} else {/*否则就是标识符,此处多出记录标识符编号的语句*/ Symbol sy = new Symbol(s);Symbol mark = sy; //⽤于标记已存在标识符Boolean isRepeat = false;sy.line = line;for (Symbol i : symtable) {if (sy.toString().equals(i.toString())) {mark = i;isRepeat = true;}}if (!isRepeat) {sy.pos = symtable.size() + 1;symtable.add(sy);} else if (isRepeat) {sy.pos = mark.pos;}tokens.add(sy);}return true;} elsereturn false;}/*符号的识别*/public Boolean isSign() throws IOException {switch (character) {case '#':readch();AllEnd.allEnd.line = line;tokens.add(AllEnd.allEnd);return true;case '\r':if (readch('\n')) {readch();LineEnd.lineEnd.line = line; tokens.add(LineEnd.lineEnd); line++;return true;}case '(':readch();Delimiter.lpar.line = line;tokens.add(Delimiter.lpar);return true;case ')':readch();Delimiter.rpar.line = line;tokens.add(Delimiter.rpar);return true;case ';':readch();Delimiter.sem.line = line;tokens.add(Delimiter.sem);return true;case '+':readch();CalcWord.add.line = line;tokens.add(CalcWord.add);return true;case '-':readch();CalcWord.sub.line = line;tokens.add(CalcWord.sub);return true;case '*':readch();CalcWord.mul.line = line;tokens.add(CalcWord.mul);return true;case '/':readch();CalcWord.div.line = line;tokens.add(CalcWord.div);return true;case ':':if (readch('=')) {readch();CalcWord.assign.line = line; tokens.add(CalcWord.assign); return true;}break;case '>':if (readch('=')) {readch();CalcWord.ge.line = line;tokens.add(CalcWord.ge);return true;}break;case '<':if (readch('=')) {readch();CalcWord.le.line = line;tokens.add(CalcWord.le);return true;}break;case '!':if (readch('=')) {readch();CalcWord.ne.line = line;tokens.add(CalcWord.ne);return true;}break;}return false;}/*下⾯开始分割关键字,标识符等信息*/ public Token scan() throws IOException { Token tok;while (character == ' ')readch();if (isDigit() || isSign() || isLetter()) {tok = tokens.get(tokens.size() - 1);} else {tok = new Token(character);printError(tok);}return tok;}}package Yue.LexicalAnalyzer;/** Token⽗类*/public class Token {public final int tag;public int line = 1;public String name = "";public int pos = 0;public Token(int t) {this.tag = t;}public String toString() {return "" + (char) tag;}}package Yue.LexicalAnalyzer;/** 单词类别赋值*/public class Tag {public final static intBEGIN = 1, //保留字END = 2, //保留字INTEGER = 3, //保留字FUNCTION = 4, //保留字READ = 5, //保留字WRITE = 6, //保留字IF = 7, //保留字THEN = 8, //保留字ELSE = 9, //保留字SYMBOL = 11, //标识符CONSTANT = 12, //常数ADD = 13, //运算符 "+"SUB = 14, //运算符 "-"MUL = 15, //运算符 "*"DIV = 16, //运算符 "/"LE = 18, //运算符 "<="GE = 19, //运算符 ">="NE = 20, //运算符 "!="ASSIGN = 23, //运算符 ":="LPAR = 24, //界符 "("RPAR = 25, //界符 ")"SEM = 26, //界符 ";"LINE_END = 27, //⾏尾符ALL_END = 28; //结尾符 "#"}package Yue.LexicalAnalyzer;/*** 保留字*/public class KeyWord extends Token {public String lexme = "";public KeyWord(String s, int t) {super(t);this.lexme = s; = "保留字";}public String toString() {return this.lexme;}public static final KeyWordbegin = new KeyWord("begin", Tag.BEGIN),end = new KeyWord("end", Tag.END),integer = new KeyWord("integer", Tag.INTEGER),function = new KeyWord("function", Tag.FUNCTION), read = new KeyWord("read", Tag.READ),write = new KeyWord("write", Tag.WRITE),aIf = new KeyWord("if", Tag.IF),aThen = new KeyWord("then", Tag.THEN),aElse = new KeyWord("else", Tag.ELSE);}package Yue.LexicalAnalyzer;/** 标识符*/public class Symbol extends Token {public String lexme = "";public Symbol(String s) {super(Tag.SYMBOL);this.lexme = s; = "标识符";}public String toString() {return this.lexme;}}package Yue.LexicalAnalyzer;/*** 运算符*/public class CalcWord extends Token {public String lexme = "";public CalcWord(String s, int t) {super(t);this.lexme = s; = "运算符";}public String toString() {return this.lexme;}public static final CalcWordadd = new CalcWord("+", Tag.ADD),sub = new CalcWord("-", Tag.SUB),mul = new CalcWord("*", Tag.MUL),div = new CalcWord("/", Tag.DIV),le = new CalcWord("<=", Tag.LE),ge = new CalcWord(">=", Tag.GE),ne = new CalcWord("!=", Tag.NE),assign = new CalcWord(":=", Tag.ASSIGN);}package Yue.LexicalAnalyzer;/*** 界符*/public class Delimiter extends Token {public String lexme = "";public Delimiter(String s, int t) {super(t);this.lexme = s; = "界符";}public String toString() {return this.lexme;}public static final Delimiterlpar = new Delimiter("(", Tag.LPAR),rpar = new Delimiter(")", Tag.RPAR),sem = new Delimiter(";", Tag.SEM);}package Yue.LexicalAnalyzer;/** 常数*/public class Num extends Token {public final int value;public Num(int v) {super(Tag.CONSTANT);this.value = v; = "常数";}public String toString() {return "" + value;}}package Yue.LexicalAnalyzer;/*** ⾏尾符*/public class LineEnd extends Token {public String lexme = "";public LineEnd(String s) {super(Tag.LINE_END);this.lexme = s; = "⾏尾符";}public String toString() {return this.lexme;}public static final LineEnd lineEnd = new LineEnd("\r\n"); }package Yue.LexicalAnalyzer;/*** 结尾符*/public class AllEnd extends Token {public String lexme = "";public AllEnd(String s) {super(Tag.ALL_END);this.lexme = s; = "结尾符";}public String toString() {return this.lexme;}public static final AllEnd allEnd = new AllEnd("#");}总结以上就睡这篇⽂章的全部内容了,希望本⽂的内容对⼤家的学习或者⼯作能带来⼀定的帮助,如果有疑问⼤家可以留⾔交流。

词法分析器在Java程序变异测试工具中的应用

词法分析器在Java程序变异测试工具中的应用
新 程序 ,每个 新程序 称 为原程 序 的一 个变 异 体 :然 后 根据 已有 的
件 ,其格 式 :fe pjv. 然后 把生 成 的 lx yC lx p a a 1 ey . ,在 .e 下 nt 编译 ,其 格式 为 :c / e y . 在 此 ,词法 分析器 的所 有工作 全 lclxy C 部完 成 。
摘 要 : 件 测试是 现 阶段保 障软件 质量 的 重要 手段 , 软 开发一 种客观 地有 针 对性地 添加 测试 数据 的工 具是 十分 必要 的。 变异 测试是 一种 有效 的基 于故 障 的测 试技 术 ,它排 错 能力 强 ,既可 以用 来揭 示软件 中隐藏 的错 误 ,又可 以衡 量 测试 用例 集 对程序 错误 的揭 示能 力 , 估 测试试 的原理 开发 一 个 Jv 程 序 的变异测 评 是 aa
二 、J T U O结 构 和功 能
析程 序调 用 的: 当语法 分析 程序 需要 一个 标记 时 ,就 调用 词法 分 析器 从上 次扫 描文 件 的位置起 识 别 下一个 符号 ,并把 识别 的结 果 返 回给语 法分 析程 序 。
六 、J v a a程序 的分析 程 序的 实现

5 T - - a a 异测 试 工具 分为 四个 功 能子系 统 :J v U O- Jv 变 a a程 序 分 析子 系 统,变 异 体管理 子系 统 ,测 试数 据管 理子 系 统 ,测试 报
制变 异测 试 充分度 ;能够 按照 需要 进行 选择 变异 ,从众 多变 异算 接 着上 次扫 描 的位 置继 续扫描 源文 件 ,当有 与规 则匹配 的单 词 时 分 析程 序是 我们 提交 给 J T U0的程序 ,它实现 的是 对 JT 测 试 的 U0 jv 文 件应 用词 法 分析器 和语 法分 析器 进行 分析 , aa 并把 分 析的 结 三 、词法 分析 器 的实现 果 送给 JT 。 UO 本文 所开 发 的词法 分析 器和 语法 分 析器 是我 们这 次 开发 的变 本 文 在实 现变 异 测试 工 具 时 ,也没 有 涉及 到面 向对 象 类技 术 领 只 a a里 一 些 基 本 语 句 、 量 和 符 号 做 得 的 分 析 : 变 异测 试工 具的 一个 部分 , 的功能 是实 现对 Jv 被 测程 序代 码 的 域 , 是 对 J v 它 aa 将 变异 测试 的 思想 应用 到面 向对象 的软件测 试 中,是一 个 很好 的 分析 ,从 中我 们得 到 测试程 序 的语 句和 单词 的有 关信 息 。我 们所 做 的词法 分析 器完 成 的任 务是 : () 1读入 测试 程 序 ,对 构成 Jv 研 究题 材 。 aa 程 序 的字 符 串进 行 扫描 和分解 , 依循 J v 语 言 的构 词规 则识 别 出 aa 参 考文 献 : 王 编译 北京 1 01 9 1 个 个 的 单词 ,如 关 键 字 、标 识符 、常 数 、算符 和 界 符 等 。 () 2 …杜 淑敏 , 永 宁. 程序 设计 原理 . 大 学 出版社 , 9 , 把识 别到 的单 词和 语 句添加 到词 汇表 里 ,直 接 分析 或 间接查 找语 『 杨华 中, 炜 Jv 语 言与 程序 设计 . 民邮 电 出版社 , 9, 2 1 假耀 aa 人 1 72 9 0

javacc

javacc

JavaccJavaCC是一个词法分析生成器和语法分析生成器。

词法分析和语法分析是处理输入字符序列的软件组件,编译器和解释器协同词法分析和语法分析来解码程序文件。

词法分析器可以把一连串的字符序列划分成一个一个的叫做“Token”的子序列,同时它也可以把这些Token 分类。

这些Token序列将会传送给语法分析器以供其决定程序的结构。

Javacc编写的规则都写在一个.jj的文件夹中: , javaCC用来处理语法文件(jj)生成解析代码.1.文件基本规则:options{JDK_VERSION = "1.7";STATIC = false;}JDK_VERSION生成代码使用的jdk版本,static指是否生成静态的解析器类. Options的参数都是它们的默认值2.主类:PARSER_BEGIN(ParserDemo)com.synnex.ParserDemo;com.synnex.*;class ParserDemopublic static void main(String args []) throws ParseException{}}PARSER_END(ParserDemo)在PARSER_BEGIN和PARSER_END之间定义语法解析器的主类,这是整个解析程序的入口,里面主要有一些引用的包和类以及一个main方法(其他的方法由JavaCC生成)。

3.定义词法规则SKIP :{ /* white space */" "| "\t"| "\n"| "\r"}TOKEN :{ /* Operators and punctuation */<PERCENT: "%">| <AMPERSAND: "&">| <CARET: "^">| <VERTICAL_BAR: "|">| <TILDE: "~">| <QUOTE: "'">| <LEFT_BRACE: "{">}SKIP定义要忽略的字符串,TOKEN定义要识别的字符串。

java-tree-sitter编译

java-tree-sitter编译

一、概述在当今软件开发领域,Java语言的应用十分广泛,因此对Java代码的分析工具也变得尤为重要。

为了提高对Java代码的分析效率和准确性,许多开发者开始使用Tree-sitter这一用于语法分析和语法树构建的工具。

而针对Java语言的语法分析工具java-tree-sitter已经成为了许多开发者的首选。

本文将对java-tree-sitter的编译过程进行深入探讨,以便读者能更加了解该工具。

二、java-tree-sitter的概述java-tree-sitter是一个专门针对Java语言的语法分析工具,它基于Tree-sitter这一通用的语法分析器。

Tree-sitter是一个快速、高效、可扩展的语法分析器,在众多编程语言的分析工具中占据了重要地位。

java-tree-sitter将这一优秀的工具应用于Java语言,可以为开发者提供准确、可靠的语法分析结果,从而在代码分析、语法高亮、自动补全等方面发挥重要作用。

三、java-tree-sitter的编译过程1. 准备工作在进行java-tree-sitter的编译之前,需要先确保系统中安装了相应的开发环境和依赖项。

其中包括CMake、GCC、Clang、Node.js等工具和库。

这些工具和库的安装可以通过系统自带的包管理器或者手动下载编译安装来完成。

2. 获取源代码java-tree-sitter的源代码托管在GitHub上,开发者可以通过git命令将其clone到本地,也可以直接下载源代码包进行解压。

获取源代码后,可以通过编辑器或者终端来进行进一步的操作。

3. 配置环境在编译java-tree-sitter之前,需要对环境进行相应的配置。

需要设置CMake和Node.js的环境变量,以便系统可以正确识别和信息相关的库和头文件。

需要检查系统中的GCC和Clang是否版本兼容,如果不兼容则需要进行相应的调整。

4. 进行编译编译java-tree-sitter的过程主要包括以下几个步骤:首先是使用CMake生成对应的Makefile文件;然后是使用make命令进行编译,生成相应的可执行文件;最后是进行安装,将生成的结果安装到系统指定的目录下。

java词法分析器实验报告

java词法分析器实验报告

Java 词法分析器实验报告--07111101--奥特曼一.词法分析器功能概述:1.使用DFA实现词法分析器的设计;2.实现对Java源程序中注释和空格(空行)的过滤;3.利用两对半缓冲区从文件中逐一读取单词;4.词法分析结果属性字流存放在独立文件(c:\words.txt)中;5.统计源程序所有单词数以、错误单词数、单词所在的行数;6.具有报告词法错误和出错位置(源程序行号)的功能;二.源程序设计实现://程序大部分参照网络,自己做了小部分改动#include<iostream>#include<fstream>#include<cstdio>#include<cstdlib>#include<cstring>#include"const.h"using namespace std;char rbuf[RBUFSIZE]; //读文件缓冲区int rp; //读文件缓冲区指针char ch; //当前扫描到的字符int type; //单词的类型char sbuf[SBUFSIZE]; //单词字符串缓冲区int sp; //单词字符串缓冲区指针ifstream inFile; //输入文件ofstream outFile; //输出文件void clear_rbuf()//清空读文件缓冲区{int i;for(i=0;i<RBUFSIZE;i++)rbuf[i]='\0';rp=0;}void clear_sbuf()//清空单词字符缓冲区{int i;for(i=0;i<SBUFSIZE;i++)sbuf[i]='\0';sp=0;}void get_ch()//从读文件缓冲区得到下一个字符{ch=rbuf[rp];rp++;}void put_ch(char ch)//向字符缓冲区追加一个字符{sbuf[sp]=ch;sp++;}void get_type(char * msg)//得到单词类型{int i;for(i=0;i<TABLE_LENGTH;i++){if (!strcmp(msg, ATTR_MAP[i].keyword)){type=ATTR_MAP[i].type;return;}}return;}int digit(int base)//判断字符是否属于base进制并转换{char c=ch;int result;if (c>='0'&&c<='7')result = (int)(c - '0');else if(c>='8'&&c<='9'){if (base > 8)result=(int)(c-'0');elseresult = -1;}else if(c>='a'&&c<= 'f'){if (base>10)result=(int)(c-'a'+10);elseresult=-1;}else if (c>='A'&&c<='F'){if (base>10)result=(int)(c-'A'+10);elseresult=-1;}elseresult=-1;return result;}void scan_fraction()//扫描指数{while(digit(10)>=0){put_ch(ch);get_ch();}if(ch=='e'||ch=='E'){put_ch(ch);get_ch();if(ch=='+'||ch=='-'){put_ch(ch);get_ch();}while(digit(10)>=0){put_ch(ch);get_ch();}return;}return;}void scan_suffix() //扫描浮点数后缀{scan_fraction();if(ch=='f'||ch=='F'||ch=='d'||ch=='D'){put_ch(ch);get_ch();}type=T_FLOAT;return;}bool is_spectial(char &ch)//判断字符是否是特殊字符{if(ch=='!'||ch=='%'||ch=='&'||ch=='*'||ch=='?'||ch=='+'||ch=='-'||ch==':'||ch=='<'| |ch=='='||ch=='>'||ch=='^'||ch=='|'||ch=='~')return true;elsereturn false;}void scan_operator()//扫描运算符{while (is_spectial(ch)){put_ch(ch);get_ch();}get_type(sbuf);if(type==0)type=T_ERROR;return;}void scan_number(int radix)//扫描8、10、16进制数值{while(digit(radix)>=0){put_ch(ch);get_ch();}if(radix!=10&&ch=='.'){put_ch(ch);get_ch();type=T_ERROR;}else if(radix==10&&ch=='.'){put_ch('.');get_ch();if(digit(10)>=0)scan_suffix();}else if(radix==10&&(ch=='e'||ch=='E'||ch=='f'||ch=='F'||ch=='d'||ch=='D')) scan_suffix();else if(ch == 'l' || ch == 'L'){put_ch(ch);get_ch();type=T_INT;}else type=T_INT;return;}void skip_comment()//跳过注释内容{while(ch!='\0'){switch(ch){case'*':get_ch();if (ch=='/'){get_ch();return;}break;default:get_ch();break;}}}bool is_idchar(char &ch)//判断字符是否标识符首字符{return((ch>='0'&&ch<='9')||(ch>='A'&&ch<='Z')||(ch>='a'&&ch<='z')||ch=='$'||ch=='_');}void scan_ident()//搜索关键字、标识符{bool id_or_key = true;bool tem=true;//是否仍是标识符或关键字while(ch!=C_TAB&&ch!=C_FF&&ch!=C_CR&&ch!=C_LF&&ch!='\0') {if(is_idchar(ch)){put_ch(ch);get_ch();if(is_idchar(ch))continue;elseget_type(sbuf);if(type!=0)return;else{type=T_IDENTIFIER;return;}}}}void scan_char()//转义字符搜索字符{int oct = 0;int hex = 0;if(ch=='\\'){get_ch();if(ch=='\\')put_ch('\\');get_ch();if(ch=='\'')put_ch('\'');get_ch();if(ch=='\"')put_ch('\"');get_ch();if(ch=='b')put_ch('\b');get_ch();if(ch=='t')put_ch('\t');get_ch();if(ch=='n')put_ch('\n');get_ch();if(ch=='f')put_ch('\f');get_ch();if(ch=='r')put_ch('\r');get_ch();if('0'<=ch&&ch<='7'){oct=digit(8);get_ch();if('0'<=ch&&ch<='7'){oct=oct*8+digit(8);get_ch();if('0'<=ch&&ch<='7'){oct=oct*8+digit(8);get_ch();}}put_ch((char)oct);}if(ch=='u'){get_ch();if(('0'<=ch&&ch<='9')||('a'<=ch&&ch<='f')||('A'<=ch&&ch<='F')){hex=hex*16+digit(16);get_ch();if(('0'<=ch&&ch<='9')||('a'<=ch&&ch<='f')||('A'<=ch&&ch<='F')){hex=hex*16+digit(16);get_ch();if(('0'<=ch&&ch<='9')||('a'<=ch&&ch<='f')||('A'<=ch&&ch<='F')) {hex=hex*16+digit(16);get_ch();if(('0'<=ch&&ch<='9')||('a'<=ch&&ch<='f')||('A'<=ch&&ch<='F')){hex=hex*16+digit(16);get_ch();}}}}put_ch((char)hex);}}else{put_ch(ch);get_ch();}}void get_word()//获取下一个单词及属性{clear_sbuf();type=0;while (ch!='\0'){if((ch>='A'&&ch<='Z')||(ch>='a'&&ch<='z')||ch=='$'||ch=='_')//关键字、标识符{scan_ident();return;}else if(ch=='\'')//字符{get_ch();if(ch=='\''){type=T_ERROR;strcpy(sbuf,"''");get_ch();}else{scan_char();if(ch=='\''){type=T_CHAR;get_ch();}else type=T_ERROR;}return;}else if(ch=='\"')//字符串{get_ch();{type=T_ERROR;strcpy(sbuf,"\"\"");get_ch();}else{do{scan_char();}while(ch!='\"'&&ch!=C_TAB&&ch!=C_FF&&ch!=C_CR&&ch!=C_LF);if(ch=='\"'){type=T_STRING;get_ch();}else type=T_ERROR;}return;}else if(ch=='.')//.开头数字{put_ch(ch);get_ch();if(digit(10)>=0)scan_suffix();else type=T_BOUND;return;}else if(ch=='0')//0开头数字{put_ch('0');get_ch();if(ch=='x'||ch=='X'){put_ch(ch);get_ch();if(digit(16)>=0&&ch!='0')scan_number(16);}else if(digit(8)>=0&&ch!='0')scan_number(8);{put_ch('.');get_ch();if(digit(10)>=0)scan_suffix();}else if(ch==' '){get_ch();type=T_INT;}else type=T_ERROR;return;}else if('1'<=ch&&ch<='9')//1-9开头数字{scan_number(10);return;}else if((ch=='(')||(ch==')')||(ch=='[')||(ch==']'))//9个界限符中的8个{put_ch(ch);get_ch();type = T_BOUND;return;}else if(ch==','){put_ch(ch);get_ch();type = T_COMMA;return;}else if((ch=='{')||(ch=='}')){put_ch(ch);get_ch();type = T_BRACKET;return;}else if(ch==';'){put_ch(ch);get_ch();type = T_SEMICOLON;return;}else if(ch=='/')//注释、'/'运算符、 '/='运算符 {get_ch();if(ch=='/'){while(ch!=C_CR&&ch!=C_LF&&ch!='\0') get_ch();break;}else if(ch=='*'){get_ch();skip_comment();}else if(ch=='='){strcpy(sbuf, "/=");type=T_ASSIGN;get_ch();}else{strcpy(sbuf, "/");type=T_MULDIV;}return;}else if(is_spectial(ch))//特殊字符{scan_operator();return;}else get_ch();//间隔符}}void readfile(char * fn_in)//将源文件读入缓冲区{rp = 0;inFile.open(fn_in);if (!inFile.is_open())return;while(inFile.get(rbuf[rp]))rp++;inFile.close();rp = 0;}void writefile()//向输出文件写字符{sp = 0;outFile << "(0x" << hex << type << ") ";outFile << "[";while(sbuf[sp]!='\0'){outFile << sbuf[sp];sp++;}outFile << "]";outFile << endl;sp = 0;}int main(int argc, char * argv[]){char fn_in[NAMESIZE];char fn_out[NAMESIZE];cout << "Input the name of Java source file: ";cin >> fn_in;readfile(fn_in);cout << "Input name of testing result file: ";cin >> fn_out;outFile.open(fn_out);get_ch();while(ch!='\0'){get_word();if(strlen(sbuf)!=0)writefile();}outFile.close();cout << "The analysis has been completed!" << endl;system("pause");return 0;}三.程序执行流程a.首先从Java文件中读取半个缓冲区的字符串读入预处理缓冲区中,将缓冲区中的注释、空行、空格全部处理,最后预处理缓冲区里面只剩下单词、一个空格、换行;b.将预处理缓冲区里面的的数据分两次读入两对半缓冲区ScanBuffer中,送入词法分析器wordScanner进行逐个单词分析,由wordScanner调用相应的转换函数进行单词属性的分析。

jexl实现原理

jexl实现原理

jexl实现原理Jexl是一种基于Java的表达式语言,它提供了一种灵活、简洁的方式来解析和执行动态表达式。

本篇文章将介绍Jexl的实现原理,帮助读者更好地理解它的工作原理和用法。

Jexl的实现原理主要包括词法分析、语法分析和执行三个步骤。

下面将分别介绍这三个步骤的具体内容。

1. 词法分析:词法分析是将输入的表达式拆分成一个个词法单元的过程。

在Jexl中,词法单元主要包括运算符、变量、常量和函数等。

词法分析器会根据事先定义好的词法规则,将输入的表达式拆分成一个个词法单元,并为每个词法单元赋予相应的词法类型。

2. 语法分析:语法分析是将词法单元组合成语法树的过程。

在Jexl 中,语法树是一个抽象的数据结构,它反映了表达式中各个词法单元之间的层次关系和运算优先级。

语法分析器会根据事先定义好的语法规则,将词法单元组合成一个个语法树节点,并为每个节点赋予相应的语法类型。

3. 执行:执行是根据语法树计算表达式结果的过程。

在Jexl中,执行器会递归地遍历语法树,根据节点类型执行相应的计算操作。

执行过程中,会根据变量的值、函数的定义和运算符的规则,计算出最终的表达式结果。

除了基本的词法分析、语法分析和执行过程,Jexl还提供了一些额外的功能,如变量赋值、函数调用和异常处理等。

这些功能可以增强表达式的灵活性和扩展性。

总结一下,Jexl的实现原理主要包括词法分析、语法分析和执行三个步骤。

词法分析将输入的表达式拆分成词法单元,语法分析将词法单元组合成语法树,执行根据语法树计算表达式结果。

通过理解Jexl的实现原理,我们可以更好地理解和使用它,提高代码的可读性和可维护性。

希望本篇文章能够帮助读者对Jexl的实现原理有一个清晰的了解,同时也希望读者能够在实际开发中灵活运用Jexl,提高代码的灵活性和可扩展性。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Java语言词法分析器的设计与实现
一.实验目的
1.强化对系统软件综合工程实现能力、规划能力的训练;
2.加强对词法分析原理、方法和基本实现技术的理解;
二.实验内容
1.使用DFA实现词法分析器的设计;
2.实现对Java源程序中注释的过滤;
3.利用两对半缓冲区从文件中逐一读取单词;
4.词法分析结果属性字流存放在独立文件(文件名:scanner_output)中;5.统计源程序每行单词的个数和整个源文件单词个数;
6.具有报告词法错误和出错位置(源程序行号和该行字符)的功能;三.说明
1.先读进半个缓冲区的字符,以后前半区的字符读完了,先把后半区的字符读到前半区,再从文件中读入字符到后半区,从而实现两对半缓冲区读单词;每次前半区读完,把前半区的字符存到第一缓冲区,以免在第一个字符时无法回退;还要建立第二缓冲区,存放当要把第一缓冲区的内容放进缓冲区前半区时后半区的内容。

2.因为附录也有设计空格和注释的属性字,所以空格和注释也输出,但空格不算入单词总数
四.源程序主要函数功能
void readin1() //读取字符到缓冲区前半区
void readin2() //把后半区的内容送到前半区
void readin3() //把第二缓冲区的内容送到后半区
char readchar() //从缓冲区中读取一个字符
void untread() //回退一个字符
void writefile() //把属性字流信息写进文件里
void error(char *string) //扫描到错误的单词,string表示错误的单词已扫描过的字符
void identifier() //扫描标识符
void key() //识别关键字
void number() //扫描数字和点号
void explain(int a) //扫描注释,a表示注释是以// 开始还是以/* 开始
void op1(char a),void op2(char a),void op3(char a),void op4(char a) //分四类扫描运算符
五.主要数据结构设计
struct stream { //属性字流 char attribute[6]; int site; };
char buf[31];
char buf1[16]; //第一缓冲区,存放被覆盖的前半区的字符 char buf2[16]; //第二缓冲区,存放被覆盖的后半区的字符 char keyword[50][13];
//关键字表
char words[50][13]; //变量表 char value[50][13]; //变量或常量的值
char note[80][20] = {"//","/*","*/"}; //注释表 char op[50][5]; //运算符表 char strings[50][50] = {"\""}; //存放字符串中单词的表 char inerror[50][50]; //错误单词表
六.FA 设计
字母,$,_,数字
标识符
整型常量
布尔常量关键字
实数常量
字符
字符串
运算符
*运算符1
运算符3。

相关文档
最新文档