基于java语言的词法分析器(简)

本文介绍了一个基于Java的词法分析器的实现,包括读取文件、词法分析、写入文件和主函数四个部分。作者强调了编码格式需设置为UTF-8,并提供了各部分代码的简要说明,所有代码可以打包带走直接使用。
摘要由CSDN通过智能技术生成

基于java语言的词法分析器(简)

作者用的idea2021,编码格式UTF-8(使用前调整编码格式以防看不到注释)

题目要求

<标识符>::=<字母>{<字母>|<数字>} //标识符和关键字都不区分大小写,比如if和IF均为关键字,不允许出现与关键字相同的标识符

<字母>::=_|a|...|z|A|...|Z

<数字>::=0|1|...|9

<整数>::=[+|-]<无符号整数>

<无符号整数>::=<数字>{<数字>}

<字符>::=‘<加法运算符>’|’<乘法运算符>’|’<字母>’|’<数字>’

<加法运算符>::=+|-

<乘法运算符>::=*|/

<字符串>::="{十进制编码为32,33,35-126的ASCII字符}"
//字符串中要求至少有一个字符

单词名称 类别码 单词名称 类别码 单词名称 类别码 单词名称 类别码
标识符 IDENFR if IFTK - MINU = ASSIG
整数 INTCON else ELSETK * MULT ; SEMICN
字符 CHARCON do DOTK / DIV , COMMA
字符串 STRCON while WHILETK < LSS ( LPARENT
const CONSTTK for FORTK <= LEQ ) RPARENT
int INTTK scanf SCANFTK > GRE [ LBRACK
char CHARTK printf PRINTFTK >= GEQ ] RBRACK
void VOIDTK return RETURNTK == EQL { LBRACE
main MAINTK + PLUS != NEQ } RBRACE

(一)读文件ReadFromText.java

这里用的是相对路径,测试文件名testfile.txt,可以自行更改。

直接给源码了

package lexicalAnalysis;

import java.io.*;

public class ReadFromText {
   
    public static File OpenFile(){
    //读取文件testfile.txt
        File file = new File("testfile.txt");
        return file;
    }

    public static String readFromText(){
    //对读取的文件进行内容处理
        File file = OpenFile();
        //用OpenFile的方法获取文件

        StringBuffer getString= new StringBuffer();
        // 创建StringBuffer容器,用于保存从文件读取的内容

        String initString = null;
        // 用initString保存取消注释后的内容(依旧包含换行符)

        BufferedReader bufferedReader = null;
        // 采用字符输入缓冲流读入数据:一次读取一行

        try{
   
            // 获取输入流对象
            bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(file),"UTF-8"));
            // 避免出现乱码,统一使用UTF-8编码
            String line;
            while ((line = bufferedReader.readLine()) != null){
   
                // 字符输入缓冲流读取一行,不会自动加上换行
                getString.append(line + "\n");
                // 手动加入换行符
            }

            String target = getString.toString().trim();
            // 对串进行去首位空格

            initString =target.replaceAll("\\/\\/[^\\n]*|\\/\\*([^\\*^\\/]*|[\\*^\\/*]*|[^\\**\\/]*)*\\*+\\/", "");
            //利用正则表达式去掉代码中的单行注释,多行注释
            /*
             * 正则表达式解读:\\/ 这样的符号在java中表示是一个斜杠字符
             * 	单行注释(// 注释内容) :\\/\\/[^\\n]*    \\/\\/是指以//开头,[^\\n]是以换行符作为的单行注释的结束标志
             * 	多行注释(\\/*注释内容\\*\\/):用法跟单行注释相同,只不过是以“*\\/” 结尾
             * 	[\\*^\\/*]*|[^\\**\\/]*)*\\*+\\/	作特殊情况约束
             */

            char[] chars = (initString+"$").toCharArray();
            // 将去注释的字符串整理成一行,并且以$结尾(词法分析结束标志)

            getString.replace(0,getString.length(),"");
            //由于获取的代码已经成功去注释,所以将其内容清空用于存放去换行的串
            for(char c : chars){
   
                if(c != '\n'){
   
                    getString.append(c);
                }else{
   
                    getString.append(" ");
                    // 去换行的地方用空格代替
                }
            }

        } catch (IOException e) {
   
            e.printStackTrace();
        } finally {
    // 完整性约束,用完文件及时关闭,以防内存浪费
            if(bufferedReader != null){
   
                try{
   
                    bufferedReader.close();
                }catch (IOException e){
   
                    e
1.根据状态转换图直接编程 编写一个词法分析程序,它从左到右逐个字符的对源程序进行扫描,产生一个个的单词的二元式,形成二元式(记号)流文件输出。在此,词法分析程序作为单独的一遍,如下图所示。 具体任务有: (1)组织源程序的输入 (2)识别单词的类别并记录类别编号和值,形成二元式输出,得到单词流文件 (3)删除注释、空格和无用符号 (4)发现并定位词法错误,需要输出错误的位置在源程序中的第几行。将错误信息输出到屏幕上。 (5)对于普通标识符和常量,分别建立标识符表和常量表(使用线性表存储),当遇到一个标识符或常量时,查找标识符表或常量表,若存在,则返回位置,否则返回0并且填写符号表或常量表。 标识符表结构:变量名,类型(整型、实型、字符型),分配的数据区地址 注:词法分析阶段只填写变量名,其它部分在语法分析、语义分析、代码生成等阶段逐步填入。 常量表结构:常量名,常量值 单词的构词规则: 字母=[A-Z a-z] 数字=[0-9] 标识符=(字母|_)(字母|数字|_)* 数字=数字(数字)*( .数字+|) 2.S语言表达式和语句说明 1.算术表达式:+、-、*、/、% 2.关系运算符:>、>=、<、<=、==、!= 3.赋值运算符:=,+=、-=、*=、/=、%= 4.变量说明:类型标识符 变量名表; 5.类型标识符:int char float 6.If语句:if 表达式then 语句 [else 语句] 7.For语句:for(表达式1;表达式2;表达式3) 语句 8.While语句:while 表达式 do 语句 9.S语言程序:由函数构成,函数不能嵌套定义。
毕业设计基于Java的C语言词法分析器可以实现对C语言程序中的词法单元进行识别、分类和分析。在设计该词法分析器时,可以利用Java语言的强大特性、丰富的类库和易于扩展的特点。 首先,我们需要定义C语言的词法规则,包括关键字、标识符、运算符、常量、分隔符等。然后,可以使用Java中的正则表达式(regex)来匹配和识别这些词法单元。通过读取C语言源代码文件,我们可以逐个字符地处理,根据不同的规则进行匹配和分类。 在词法分析器中,可以使用Java中的InputStream、FileReader等类来读取源代码文件,并使用Java中的Scanner类来逐个字符地进行分析。通过提供一个状态机(state machine)来跟踪词法分析的过程,我们可以逐个字符地进行匹配并识别词法单元。 对于不同的词法单元,可以设计相应的处理逻辑。如遇到标识符,可以使用Java的HashMap等数据结构来保存已经识别的标识符,并为每个标识符分配一个唯一的标识符编号;对于关键字,可以使用预定义好的关键字列表进行匹配;对于运算符,可以使用正则表达式进行匹配等。 最后,词法分析器应该能够输出识别出的词法单元,并可在命令行窗口或文件中保存结果。可以使用Java中的I/O流来实现这一功能。 综上所述,基于Java的C语言词法分析器可以通过利用Java语言的特性和类库来方便地实现对C语言程序中的词法单元进行识别和分析。它可以通过逐个字符地匹配和分类来实现对不同类型的词法单元的识别,并可以输出结果。这个词法分析器可以作为其他编译工具的基础,如语法分析器和编译器。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值