词法分析(英语:lexical analysis)是计算机科学中将字符序列转换为单词(Token)序列的过程。进行词法分析的程序或者函数叫作词法分析器(Lexical analyzer,简称Lexer),也叫扫描器(Scanner)。词法分析器一般以函数的形式存在,供语法分析器调用。 完成词法分析任务的程序称为词法分析程序或词法分析器或扫描器。
实验目的
通过本实验使学生进一步熟悉和掌握程序设计语言的词法分析程序的设计原理及相关的设计技术,如何针对确定的有限状态自动机进行编程序;熟悉和掌握程序设计语言的语法分析程序的设计原理、熟悉和掌握算符优先分析方法。
实验要求
本实验要求:①要求能熟练使用程序设计语言编程;②在上机之前要有详细的设计报告(预习报告);③要编写出完成相应任务的程序并在计算机上准确地运行;④实验结束后要写出上机实验报告。
实验题目
针对下面文法G(S):
S→ v = E
E→E+E│E-E│E*E│E/E│(E)│ v │ i
其中,v为标识符,i为整型或实型数。要求完成
① 使用自动机技术实现一个词法分析程序;
② 使用算符优先分析方法实现其语法分析程序,在语法分析过程中同时完成常量表达式的计算。
构建DFA
java代码
结合注释和DFA的图看就好了
package lab1;
import java.util.*;
/*
编号规定:
001:加法运算符
002:减法运算符
003:乘法运算符
004:除法运算符
005:左括号
013:右括号
008.标识符
010.整数
011.等号运算符
012.浮点数
014:错误字段
*/
public class lexicalAnalysis {
private static char[] Code;//转化为字符数组
public static ArrayList<String> tokens=new ArrayList<>();//用于之后的语法分析传值使用
public static void main(String[] args) {
// String s = "abc2@e=num2+12.3.23)*123-12.#";//输入符号串
String s = "A1=1.2+3*(4-6/3)#";//表达式为A1=1.2+3*(4-6/3)
StartLexicalAnalysis(s);
}
public static void StartLexicalAnalysis(String s) {
//开始进行语法分析
if (IsCode(s)) {
//判断
System.out.println("当前输入符号为:" + s.substring(0,s.length()-1));
System.out.println("词法分析结果如下:");
StartState(0, 0);
}
}
private static boolean IsCode(String s){
//判断源代码是否为空,为空则不能进行词法分析
if (s.isEmpty()||s.toCharArray()[0]=='#') {
System.out.println("源代码为空,无法进行词法分析!");
return false;
}
else {
Code = s.toCharArray();
return true;
}
}
private static void StartState(int basicPointer, int currentPointer)//状态0,初始状态
{
if (Code[currentPointer] == '#') {
System.out.println("词法分析结束");
}
else if (IsEqual(Code[currentPointer]))//如果当前字符是等于号进入EqualState
{
EqualState(currentPointer);
}
else if (IsAdd(Code[currentPointer]))//如果当前字符是加号进入AddState
{
AddState(currentPointer);