Во -первых, давайте посмотрим на сегмент кода, который мы хотим проанализировать следующим образом:
Результат вывода заключается в следующем:
Результат вывода (а) .png
Результат вывода (b) .png
Результат вывода (c) .png
В скобках есть бинарное выражение: (кодирование категории слов, номер положения слов)
Код заключается в следующем:
пакет yue.lexicalanalyzer; импорт java.io.*;/** Главная программа*/public class main {public void main (string [] args) бросает ioException {lexer lexer = new lexer (); lexer.printtoken (); lexer.printsymbolstable (); }} пакет yue.lexicalanalyzer; импорт java.io.*; импортировать java.util.*;/**Lexical Analysis and Output*/Public Class Lexer {/*Номер строки записи*/public static int line = 1; /*Хранилище последних символов чтения*/ char mearry = ''; /*Резервировать слова*/ hashtable <String, Keyword> Keywords = new Hashtable <String, Keyword> (); /*Последовательность токена*/ private ArrayList <token> tokens = new ArrayList <token> (); /*Таблица символов*/ private ArrayList <Symbol> symtable = new ArrayList <Symbol> (); /*Читать переменную файла*/ BufferedReader Reader = null; /*Сохранить, будет ли в настоящее время прочитан конец файла*/ private boolean isend = false; /*Читает ли конец файла*/ public boolean getReaderState () {return this.isend; }/*Print token sequence*/public void printToken () throws ioException {filewriter writer = new FileWriter ("e: //lex.txt"); System.out.println («Результаты лексического анализа следующие:»); System.out.print ("du yue-2015220202031/r/n/n"); writer.write ("du yue-2015220201031/r/n/r/n"); while (getReaderState () == false) {token tok = scan (); String str = "line" + tok.line + "/t (" + tok.tag + "," + tok.pos + ")/t/t" + tok.name + ":" + tok.tostring () + "/r/n"; writer.write (str); System.out.print (str); } writer.flush (); }/*Таблица символов печати*/public void printsymbolstable () throws ioexception {filewriter writer = new FileWriter ("e: //symtab1.txt"); System.out.print ("/r/n/r/n таблица символов/r/n"); System.out.print ("номер строки номера/T name/t name/r/n"); writer.write ("Символ таблица/r/n"); writer.write ("номер" + "/t -номер" + "/t name/r/n"); Итератор <symbol> e = symtable.iterator (); while (e.hasnext ()) {символ символ = e.next (); String desc = symbol.pos + "/t" + symbol.line + "/t" + symbol.tostring (); System.out.print (desc + "/r/n"); writer.write (desc + "/r/n"); } writer.flush (); }/*Ошибка печати*/public void printerror (token tok) throws ioexception {filewriter writer = new FileWriter ("e: //error.txt"); System.out.print ("/r/n/r/n Ошибка лексикография следующая:/r/n"); writer.write («Лексикография ошибки выглядит следующим образом: /r /n»); String str = "line" + tok.line + "/t (" + tok.tag + "," + tok.pos + ")/t/t" + tok.name + ":" + tok.tostring () + "/r/n"; writer.write (str); } /*Добавить зарезервированные слова* / void резерв (ключевое слово w) {keywords.put (w.lexme, w); } public lexer () {/*Инициализировать переменную для чтения файла*/try {reader = new BufferedReader (new FileReader ("e: //input.txt")); } catch (ioException e) {System.out.print (e); } /*Добавить зарезервированные слова* / this.reserve (Keyword.begin); this.Reserve (KeyWord.end); this.Reserve (ключевое слово.integer); это. this.Reserve (KeyWord.read); this.Reserve (ключевое слово.write); this.Reserve (KeyWord.AIF); это. this.Reserve (KeyWord.aelse); } /*Читать символом* / public void readch () бросает ioException {символ = (char) reader.read (); if ((int) символ == 0xffff) {this.isend = true; }} /*Судьте, соответствует ли он* / public boolean readch (char ch) бросает ioException {readch (); if (this.character! = CH) {вернуть false; } this.Character = ''; вернуть истину; } /*Признание чисел* / public boolean isDigit () бросает ioException {if (символ.isdigit (символ)) {int value = 0; while (символ.isdigit (символ)) {value = 10 * value + parment.digit (символ, 10); readch (); } Num n = new num (значение); n.line = line; tokens.add (n); вернуть истину; } else вернуть false; } /*Признание зарезервированных слов и идентификаторов* / public Boolean Isletter () бросает ioException {if (символ. /*Сначала получите все разделение*/ while (символ. readch (); } /*Судья, является ли это зарезервированным словом или идентификатором* / string s = sb.toString (); Ключевое слово w = ключевые слова. /*Если это зарезервированное слово, W не должно быть пустым*/ if (w! = Null) {w.line = line; tokens.add (w); } else { /* В противном случае это идентификатор, здесь есть дополнительные операторы, которые записывают номер идентификатора* / symbol Sy = new Symbol (ы); Символ Mark = sy; // используется для обозначения существующего идентификатора Boolean Isrepeat = false; sy.line = line; for (Symbol I: Symtable) {if (sy.ToString (). equals (i.toString ())) {mark = i; isrepeat = true; }} if (! ISrepeat) {sy.pos = symtable.size () + 1; symtable.add (sy); } else if (isrepeat) {sy.pos = mark.pos; } tokens.add (sy); } вернуть true; } else вернуть false; } /*Распознавание символов* / public boolean issign () бросает ioException {switch (символ) {case '#': readch (); Allend.allend.line = line; tokens.add (allend.allend); вернуть истину; case '/r': if (readch ('/n')) {readch (); Lineend.lineend.line = line; tokens.add (lineend.lineend); Line ++; вернуть истину; } case '(': readch (); delimiter.lpar.line = line; tokens.add (delimiter.lpar); return true; case ')': readch (); Delimiter.rpar.line = line; tokens.add (delimiter.rpar); вернуть истину; case ';': readch (); Delimiter.sem.line = line; tokens.add (delimiter.sem); вернуть истину; case '+': readch (); Calcword.add.line = line; tokens.add (calcword.add); вернуть истину; case '-': readch (); Calcword.sub.line = line; tokens.add (calcword.sub); вернуть истину; case '*': readch (); Calcword.mul.line = line; tokens.add (calcword.mul); вернуть истину; case '/': readch (); Calcword.div.line = line; tokens.add (calcword.div); вернуть истину; case ':': if (readch ('=')) {readch (); Calcword.assign.line = line; tokens.add (calcword.assign); вернуть истину; } перерыв; case '>': if (readch ('=')) {readch (); Calcword.ge.line = line; tokens.add (calcword.ge); вернуть истину; } перерыв; case '<': if (readch ('=')) {readch (); Calcword.le.line = line; tokens.add (calcword.le); вернуть истину; } перерыв; case '!': if (readch ('=')) {readch (); Calcword.ne.line = line; tokens.add (calcword.ne); вернуть истину; } перерыв; } вернуть false; } /*Следующее начинает разделить ключевые слова, идентификаторы и другую информацию* / public token scan () бросает ioException {token tok; while (символ == '') readch (); if (isdigit () || issign () || isletter ()) {tok = tokens.get (tokens.size () - 1); } else {tok = new Token (символ); Printerror (Tok); } вернуть ток; }} пакет yue.lexicalanalyzer;/ * * token parent class */public class token {public final int Tag; public int line = 1; public String name = ""; public int pos = 0; public token (int t) {this.tag = t; } public String toString () {return "" + (char) Tag; }} Пакет yue.lexicalAnalyzer;/** Назначение категории слов*/Общедоступный тег класса {public infit int int begin = 1, // Зарезервированное слово end = 2, // Зарезервированное слово integer = 3, // Зарезервированная функция слова = 4, // Зарезервированное слово read = 5, // Зарезервированное слово witch = 6, // Заправленное слово, если = 7, // Заповеденное слово. // Постоянная идентификатор = 12, // постоянное добавление = 13, // оператор "+" sub = 14, // оператор "-" mul = 15, // оператор "*" div = 16, // operator "/" le = 18, // оператор "<=" ge = 19, // Оператор "> =" ne = 20, // operator "! // оператор "(" rpar = 25, // operator ")" sem = 26, // operator ";"; Line_end = 27, // оператор all_end = 28; // Оператор "#"} Package yue.lexicalanalyzer;/*** Зарезервированные слова*/открытый ключевой слов класса расширяет токен {public String lexme = ""; "; открытое ключевое слово (String S, int T) {super (t); this.lexme = s; this.name = "Зарезервированные слова"; } public String toString () {return this.lexme; } public static final Keyword begin = новое ключевое слово ("begin", tag.begin), end = новое ключевое слово ("end", tag.end), integer = new Keyword ("Integer", Tag.Integer), function = новое ключевое слово ("function", tag.funct Tag.if), athen = new Keyword ("tag., tag.then), aelse = new Keyword (" else ", Tag.else);} пакет yue.lexicalanalyzer;/** Идентификатор*/public class symbol расширяет токен {public String lexme = ""; public Symbol (String S) {super (tag.symbol); this.lexme = s; this.name = "идентификатор"; } public String toString () {return this.lexme; }} пакет yue.lexicalanalyzer;/*** operator*/public class calcword extends token {public String lexme = ""; public Calcword (String S, Int T) {super (t); this.lexme = s; this.name = "operator"; } public String toString () {return this.lexme; } public Static Final Calcword add = new Calcword ("+", tag.add), sub = new Calcword ("-", tag.sub), mul = new Calcword ("*", tag.mul), div = new Calcword ("/", Tag.div), Le = new Calcword ("<=", Tag.le), ge = geclad ("> =", "ne" = nebled vwrowd (ne vwrowd (ne. Tag.ne), assign = new Calcword (": =", tag.assign);} Package yue.lexicalanalyzer;/*** ограничивающий символ*/Общедоступный делимитер расширяет токен {public String lexme = ""; "; Public DeLimiter (String S, int T) {super (t); this.lexme = s; this.name = "ограничивающий символ"; } public String toString () {return this.lexme; } public Static Final DeLimiter LPAR = new DeLimiter ("(", Tag.lpar), RPAR = new DeLimiter (")", Tag.rpar), Sem = new DeLimiter (";", Tag.Sem);} package yue.lexicalanalyzer;/** constant*/public class num расширяет токен {public final int value; public num (int v) {super (tag.constant); this.value = v; this.name = "constant"; } public String toString () {return "" + value; }} Package yue.lexicalanalyzer;/*** Конец линейных символов*/public class lineend extends token {public String lexme = ""; "; public lineend (String S) {super (Tag.line_end); this.lexme = s; this.name = "конец линейных символов"; } public String toString () {return this.lexme; } public static final Lineend Lineend = new Lineend ("/r/n");} Package yue.lexicalanalyzer;/*** Окончательный символ*/public class allend Extends token {public String lexme = ""; public allend (String S) {super (tag.all_end); this.lexme = s; this.name = "конечный персонаж"; } public String toString () {return this.lexme; } public static final allend allend = new Allend ("#");}Суммировать
Я собираюсь спать со всем содержанием этой статьи. Я надеюсь, что содержание этой статьи поможет вашему обучению или работе. Если у вас есть какие -либо вопросы, вы можете оставить сообщение для общения.