编译中的词法分析程序
来源:互联网 发布:js数据添加二维数组 编辑:程序博客网 时间:2024/05/18 18:22
import java.util.*;/** * @author SXH * @说明 词法分析器 * */public class LexicalAnalysis {/** * 存储源代码 * */static String sourceCode;/** * 两个指针 * */static int pointA = 0, pointB = 0;/** * 当前字符 * */static char presentChar;/** * 存放每次识别的单词 * */static StringBuilder temp = new StringBuilder("");/** * 是否处于单词中 */static boolean flagL = false;/** * 是否处于数字中 * */static boolean flagN = false;/** * 是否是双星号即“**” * */static boolean isDoubleAsterisk = false;/** * 词法分析 */public static void main(String[] args) {System.out.println("单词符号\t\t种别编码\t\t单词属性");System.out.println("begin\t\t 1\t\t ---");System.out.println("if\t\t 2\t\t ---");System.out.println("then\t\t 3\t\t ---");System.out.println("else\t\t 4\t\t ---");System.out.println("end\t\t 5\t\t ---");System.out.println("标识符\t\t 6\t\t在名字表中的地址");System.out.println("整型常数\t\t 7\t\t十进制整数");System.out.println("+\t\t 8\t\t ---");System.out.println("*\t\t 9\t\t ---");System.out.println("**\t\t 10\t\t ---");System.out.println("(\t\t 11\t\t ---");System.out.println(")\t\t 12\t\t ---");System.out.println("*************************************");System.out.println(" 将以二元式形式输出:(种别编码,属性值)");Scanner s = new Scanner(System.in);System.out.print("请输入:");sourceCode = s.nextLine();lexicalAnalysis(sourceCode);}/** * 词法分析 * * @param sourceCode * 需要分析的字符串 * */static void lexicalAnalysis(String sourceCode) {for (int i = 0; i < sourceCode.length(); i++) {if (isDoubleAsterisk) {// 是连续的两个*,去检测下一个字符isDoubleAsterisk = false;continue;} else {presentChar = sourceCode.charAt(i);if (sourceCode.charAt(i) >= 'a' && sourceCode.charAt(i) <= 'z') {// 如果是字母if (flagL == false) {// 标识符的第一个字符pointA = i;flagL = true;} else {// 仍然处于标识符中}continue;} else if (sourceCode.charAt(i) >= '0'&& sourceCode.charAt(i) <= '9') {// 如果是数字if (flagN == false && flagL == false) {// 数字的第一个字符,他一定是数字pointA = i;flagN = true;} else if (flagL == false && flagN == true) {// 仍然处于数字中} else if (flagL == true && flagN == false) {// 虽是数字,但他处于标识符中} else {// 数字中出现了字符,错误!!!System.err.println("数字中出现了字符,错误!!!");return;}continue;} else if (sourceCode.charAt(i) == '+'|| sourceCode.charAt(i) == '*'|| sourceCode.charAt(i) == '('|| sourceCode.charAt(i) == ')') {// 是其它几个字符pointB = i;switch (sourceCode.charAt(i)) {case '+':display();System.out.println("(8,-)");break;case '*':if (sourceCode.charAt(i + 1) == '*') {System.out.println("(10,-)");isDoubleAsterisk = true;// i++;} else {display();System.out.println("(9,-)");}break;case '(':System.out.println("(11,-)");break;case ')':display();System.out.println("(12,-)");break;}} else if (sourceCode.charAt(i) == ' ') {pointB = i;display();} else {//输入了不能识别的字符System.err.println("输入了不能检测的字符:" + sourceCode.charAt(i));return;}}}}/** * 显示标识符 * */static void letter() {// temp.append(sourceCode.charAt(presentChar));System.out.println("(6," + (pointA + 1) + ")");temp = new StringBuilder();return;}/** * 显示数字 * */static void number() {// temp.append(sourceCode.charAt(presentChar));System.out.println("(7," + temp + ")");temp = new StringBuilder();return;}/** * 显示其他字符,但是没有用上 * */static void other() {temp.append(sourceCode.charAt(presentChar));return;}/** * 将数字、标识符、关键字输出 * */static void display() {flagL = false;flagN = false;temp.append(sourceCode, pointA, pointB);if (temp.charAt(0) >= '0' && temp.charAt(0) <= '9') {// 以数字开头一定是数字number();} else if (temp.charAt(0) >= 'a' && temp.charAt(0) <= 'z') {// 以字母开头是标识符或关键字if (temp.toString().equals("begin")) {System.out.println("(1,-)");} else if (temp.toString().equals("if")) {System.out.println("(2,-)");} else if (temp.toString().equals("then")) {System.out.println("(3,-)");} else if (temp.toString().equals("else")) {System.out.println("(4,-)");} else if (temp.toString().equals("end")) {System.out.println("(5,-)");} else {letter();}}}/** * 本来打算写一个将字符串转化为16位字符数组的函数,结果还是不能匹配,没有使用 * */static char[] toCharArray16(String string) {char array[] = new char[16];for (int j = 0; j < array.length; j++) {if (j < string.length())array[j] = string.charAt(j);else {array[j] = ' ';}}return array;}}
0 0
- 编译中的词法分析程序
- [2]《编译》词法分析程序
- 编译原理词法分析程序
- 编译原理词法分析程序
- 编译原理词法分析程序
- 编译原理:词法分析程序
- 编译原理 词法分析程序
- 编译原理(词法分析程序)
- 编译原理实验一 词法分析程序
- 编译原理-词法分析程序1
- 编译原理 词法分析
- 编译原理词法分析
- 编译原理 词法分析
- 编译原理词法分析
- 编译原理词法分析
- 编译原理词法分析
- 编译原理 词法分析
- 编译原理--词法分析
- 大数据量导出Excel的方案
- QDebug相关
- Reverse Integer leetcode
- Xcode 6.1 做ipa企业级分发(In-House模式)详细步骤
- Tab Control的使用
- 编译中的词法分析程序
- 让SecureCRT显示光标所在处(光标闪烁)
- 计算机中带符号的整数为何采用二进制的补码进行存储?
- 什么是高、大、上的数据库DDL
- 第2章 2.5输出JSP表达式
- C++string类常用函数
- Linux启动原理介绍及设置开机启动脚本方法
- hello wcf(wcf入门:iis寄宿)(唐僧式啰嗦版)(下)
- 解决在主线程不能访问网络的问题