编译中的词法分析程序

来源:互联网 发布: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