词法编辑器(Java)

import java.awt.*;
import java.util.Scanner;

/**
 * Created by s2002 on 2016/9/30.
 */
public class com {
    public static void main(String[] args) {

        //限制字符串最大值
        final int MAX_LEN = 100;

        //关键字
        String[] key_word = new String[]{"begin","end","if","then","while","do"};

        //录入用户输入
        Scanner input = new Scanner(System.in);
        System.out.print("Please input a string <end with ‘#‘>:");
        String uString = input.nextLine();

        char[] analyseData = new char[MAX_LEN];

        int index = 0, key = 0;
        List list = new List();

        do {
            String compareStr = null;
            char temp = uString.charAt(index);
            list = extactCharacters(temp, analyseData, key_word, uString, index, compareStr);
            if (list.getItemCount() == 0) {
                index++;
                continue;
            }
            // 规定List的第一个元素为index,第二个元素为key
            index = Integer.parseInt(list.getItem(0));
            key = Integer.parseInt(list.getItem(1));
            String words = list.getItem(2);
            System.out.println("< " + key + " ," + words + " >");
        } while (key != 0);

    }

    public static List extactCharacters(char temp, char[] analyseDate, String[] keywords, String uString, int index,
                                        String compareStr) {

        int keyID = -1, m = 0;

        List list = new List();
        //判断下一个读入的字符是否为空格,若读取到空格则跳过,提取下一个字符进行判断
        while (temp != ‘ ‘) {
            //判断当前字符是字母或者数字和字母的组合
            if (temp >= ‘a‘ && temp <= ‘z‘) {
                m = 0;

                // 当读取到不是大小写字母或者数字时候判断为一个单词读取完成
                while (temp >= ‘a‘ && temp <= ‘z‘ || temp >= ‘A‘ && temp <= ‘Z‘ || temp >= ‘0‘ && temp <= ‘9‘) {
                    analyseDate[m++] = temp;
                    compareStr += temp + "";
                    temp = uString.charAt(++index);
                }

                // 与读取出来的字符判断是否为关键字
                compareStr = compareStr.substring(4);
                for (int i = 0; i < 6; i++) {
                    if (compareStr.equals(keywords[i])) {
                        keyID = i + 1;
                        list.add(index + "");
                        list.add(keyID + "");
                        list.add(compareStr);
                        return list;
                    }
                }

                //若为非关键字就当作为标识符
                keyID = 10;
                list.add(index + "");
                list.add(keyID + "");
                list.add(compareStr);
                return list;
            }

            //判断当前字符是否为数字
            else if (temp >= ‘0‘ && temp <= ‘9‘) {
                m = 0;
                String tempTokens = null;
                // 对后面的字符进行判断是否为数字
                while (temp >= ‘0‘ && temp <= ‘9‘) {
                    analyseDate[m++] = temp;
                    tempTokens += temp;
                    temp = uString.charAt(++index);
                }
                // 不是数字则返回种别码,结束当前方法
                keyID = 11;
                tempTokens = tempTokens.substring(4);
                list.add(index + "");
                list.add(keyID + "");
                list.add(tempTokens + "");
                return list;
            }
            m = 0;
            //判断当前字符是否为其他关系运算符
            String token = null;
            switch (temp) {
                case ‘<‘:
                    // String token = null;
                    analyseDate[m++] = temp;
                    token += temp;
                    if (uString.charAt(++index) == ‘=‘) {
                        analyseDate[m++] = temp;
                        keyID = 22;
                        token += uString.charAt(index++);
                    } else if (uString.charAt(++index) == ‘>‘) {
                        analyseDate[m++] = temp;
                        keyID = 21;
                        token += uString.charAt(index++);
                    } else {
                        keyID = 23;
                    }
                    list.add(index + "");
                    list.add(keyID + "");
                    token = token.substring(4);
                    list.add(token);
                    return list;
                case ‘>‘:
                    analyseDate[m++] = temp;
                    token += temp;
                    if (uString.charAt(++index) == ‘=‘) {
                        keyID = 24;
                        analyseDate[m++] = temp;
                        token += uString.charAt(index++);
                    } else {
                        keyID = 20;
                    }
                    list.add(index + "");
                    list.add(keyID + "");
                    token = token.substring(4);
                    list.add(token);
                    return list;
                case ‘:‘:

                    analyseDate[m++] = temp;
                    token += temp;
                    if (uString.charAt(++index) == ‘=‘) {
                        keyID = 18;
                        // analyseDate[m++] = temp;
                        analyseDate[m++] = uString.charAt(index);
                        token += uString.charAt(index++);
                    } else {
                        keyID = 17;
                    }
                    list.add(index + "");
                    list.add(keyID + "");
                    token = token.substring(4);
                    list.add(token);
                    return list;
                case ‘*‘:
                    keyID = 13;
                    break;
                case ‘/‘:
                    keyID = 14;
                    break;
                case ‘+‘:
                    keyID = 15;
                    break;
                case ‘-‘:
                    keyID = 16;
                    break;
                case ‘=‘:
                    keyID = 25;
                    break;
                case ‘;‘:
                    keyID = 26;
                    break;
                case ‘(‘:
                    keyID = 27;
                    break;
                case ‘)‘:
                    keyID = 28;
                    break;
                case ‘#‘:
                    keyID = 0;
                    break;
                default:
                    keyID = -1;
                    break;
            }
            analyseDate[m++] = temp;
            list.add(++index + "");
            list.add(keyID + "");
            list.add(temp + "");
            return list;
        }
        return list;
    }
}

程序功能:可以模拟将用户输入的代码分解成词,进行词法分析,并将其字符与种别码对应输出。

种别码表:


单词符号


种别码


单词符号


种别码


begin


1


:


17


if


2


:=


18


then


3


<


20


while


4


<=


21


do


5


<>


22


end


6


>


23


l(l|d)*


10


>=


24


dd*


11


=


25


+


13


;


26


-


14


(


27


*


15


)


28


/


16


#


0

时间: 2024-12-29 16:25:15

词法编辑器(Java)的相关文章

百度UMeditor富文本编辑器java使用

百度UMeditor富文本编辑器java使用 1.介绍 UMeditor 是一款轻量级的富文本编辑器,比UEditor要小得多,是为满足广大门户网站对于简单发帖框,或者回复框需求所定制的在线富文本编辑器 2.下载    官网地址:http://ueditor.baidu.com/website/umeditor.html 说明笔者点击官网的下载中的按钮,半天没反应,然后又去了github上down了一份,github地址:https://github.com/fex-team/umeditor/

富文本编辑器 CKeditor 配置使用 (带附件)

Ckeditor下载地址:http://ckeditor.com/download 1.CKeditor的基本配置 var textval=CKEDITOR.instances.TextArea1.getData(); //获取带HTML的值 var stemTxt=CKEDITOR.instances.TextArea1.document.getBody().getText();//获取纯文本 CKEDITOR.instances.TextArea1.setData(data.content)

JAVA微服务架构视频教程

教程目录:┣━JAVA微服务架构视频教程┃ ┣━Java教程:第1章 微服务简介 4┃ ┃ ┣━Java教程:001构建单体应用┃ ┃ ┣━Java教程:002微服务解决复杂问题┃ ┃ ┣━Java教程:003微服务的优点┃ ┃ ┣━Java教程:004微服务的缺点┃ ┣━Java教程:第2章 Linux使用 19┃ ┃ ┣━Java教程:005Linux 简介┃ ┃ ┣━Java教程:006Linux 与 Windows 比较┃ ┃ ┣━Java教程:007安装 Linux┃ ┃ ┣━Java

Linux下crontab命令的用法

cron来源于希腊单词chronos(意为“时间”),是linux系统下一个自动执行指定任务的程序.例如,你想在每晚睡觉期间创建某些文件或文件夹的备份,就可以用cron来自动执行. 服务的启动和停止 cron服务是linux的内置服务,但它不会开机自动启动.可以用以下命令启动和停止服务: Linux代码   /sbin/service crond start /sbin/service crond stop /sbin/service crond restart /sbin/service cr

开发步骤

idea->写功能集合->画原型图.数据模型.业务流图->开发 每一步过程都是迭代的,需要让用户确认才能开始下一个步骤 和用户交流的过程中察言观色,让对方保持兴趣.要学会吸引/劝慰用户,但是不能强硬,让人觉得你是一个领袖,而非独裁者 写功能集合的时候需要给用户看的文档1:功能集(用词准确,减少歧义,写一些必须完成的功能)2:说明文档(是关于本系统的详细描述)3:疑问(包括扩充的功能,例如:是否进行实名制) 发给用户的文档格式: 让对方比较容易打开,可用doc.pdf,甚至图片也行,最好别

cocos2d-x-3.1 Text Labels(官方正式译文)

介绍 cocos2d支持(true type字体)标签,和纹理地图集标签. LabelTTF 标签的优缺点: 全部 TTF 字体的长处: 随意大小,支持调整字距. 易于使用. 不须要外部编辑器. 创建或更新很慢.是由于会创建一个新的纹理, 尤其是在Android设备上. LabelAtlas, LabelBMFont 优缺点: 创建和更新很快, 是由于不会创建一个新的纹理. 字体能够进行定制 (阴影, 渐变, 模糊, 等) 依赖于外部编辑器: AngelCode / Hiero editor,

java代码编辑器 pdf文件预览 主流SSM 代码生成器 shrio redis websocket即时通讯

A代码编辑器,在线模版编辑,仿开发工具编辑器,pdf在线预览,文件转换编码 B 集成代码生成器 [正反双向](单表.主表.明细表.树形表,快速开发利器)+快速表单构建器 freemaker模版技术 ,0个代码不用写,生成完整的一个模块,带页面.建表sql脚本,处理类,service等完整模块 C 集成阿里巴巴数据库连接池druid  数据库连接池  阿里巴巴的 druid.Druid在监控.可扩展性.稳定性和性能方面都有明显的优势 D 集成安全权限框架shiro   Shiro 是一个用 Jav

java sql编辑器 动态报表 数据库备份还原 quartz定时任务调度 自定义表单 java图片爬虫

获取[下载地址]   QQ: 313596790   [免费支持更新] 三大数据库 mysql  oracle  sqlsever   更专业.更强悍.适合不同用户群体 [新录针对本系统的视频教程,手把手教开发一个模块,快速掌握本系统] A 集成代码生成器(开发利器)+快速构建表单;            QQ:313596790 freemaker模版技术 ,0个代码不用写,生成完整的一个模块,带页面.建表sql脚本,处理类,service等完整模块 B 集成阿里巴巴数据库连接池druid;

ckeditor编辑器在java项目中配置

一.基本使用: 1.所需文件架包 A. Ckeditor基本文件包,比如:ckeditor_3.6.2.zip 下载地址:http://ckeditor.com/download 2.配置使用 A.将下载下来的CKEditor压缩解压,将解压后的文件夹("ckeditor")拷贝进项目里面,比如我是放在"WebContent"的"commons"文件夹下: B.在需要使用CKEditor的页面引入CKEditor的支持javascript <