当前位置:首页 » 编程语言 » 词法分析java

词法分析java

发布时间: 2023-03-05 07:44:04

1. 如何用java编写词法分析器程序

我也做过这个作业

packagesource;

importjava.util.LinkedList;

publicclassLexicalAnalysis
{
//私有变量声明
privateLinkedList<Word>optr=newLinkedList<Word>();
privateStringexp;
//词法分析
publicLinkedList<Word>lexical_analysis(Stringexp)
{
charch='';//当前文件指针内容
intindex=0;//文件指针
StringBufferstrToken=newStringBuffer("");
//扫描处理字符串
while(true)
{
ch=exp.charAt(index);
index++;
//标识符(字母开头,数字或字符组成)
if(Character.isLetter(ch))
{
while(Character.isLetter(ch)||Character.isDigit(ch))
{
strToken.append(ch);
ch=exp.charAt(index);
index++;
}
index--;
Stringstr=strToken.toString();
if(str.equals("if"))
optr.add(newWord(str,13));
elseif(str.equals("else"))
optr.add(newWord(str,14));
elseif(str.equals("then"))
optr.add(newWord(str,15));
else
optr.add(newWord(str,26));
}
//数字
elseif(Character.isDigit(ch))
{
while(Character.isDigit(ch))
{
strToken.append(ch);
ch=exp.charAt(index);
index++;
}
index--;
optr.add(newWord(strToken.toString(),26));
}
//加号或自加
elseif(ch=='+')
{
ch=exp.charAt(index);
index++;
if(ch=='+')
optr.add(newWord("++",21));
elseif(ch=='=')
optr.add(newWord("+=",16));
else
{
index--;
optr.add(newWord("+",19));
}
}
//加号或自加
elseif(ch=='-')
{
ch=exp.charAt(index);
index++;
if(ch=='-')
optr.add(newWord("--",21));
elseif(ch=='=')
optr.add(newWord("-=",16));
else
{
index--;
optr.add(newWord("-",19));
}
}
//乘法或乘幂
elseif(ch=='*')
{
ch=exp.charAt(index);
index++;
if(ch=='*')
optr.add(newWord("**",20));
elseif(ch=='=')
optr.add(newWord("*=",16));
else
{
index--;
optr.add(newWord("*",20));
}
}
//除法或注释
elseif(ch=='/')
{
ch=exp.charAt(index);
index++;
//多行注释
if(ch=='*')
{
while(true)
{
ch=exp.charAt(index);
index++;
if(ch=='*')
{
ch=exp.charAt(index);
index++;
if(ch=='/')break;
elseif(ch==' ')
{
exp=Input.newLine();
index=0;
ch=exp.charAt(index);
index++;
}
elseindex--;
}
elseif(ch=='#')
{
inttIndex=index-1;
if(exp.length()>tIndex+9)
{
Stringend=exp.substring(tIndex,tIndex+9);
if(end.equals("#?e_N_d?#"))break;
}
else
{
System.out.println("非法符号'#'后的语句忽略!");
exp=Input.newLine();
index=0;
break;
}
}
elseif(ch==' ')
{
exp=Input.newLine();
index=0;
}
}
}
//单行注释
elseif(ch=='/')
break;
elseif(ch=='=')
optr.add(newWord("/=",16));
else
{
index--;
optr.add(newWord("/",20));
}
}
//大于或大于等于或右移
elseif(ch=='>')
{
ch=exp.charAt(index);
index++;
if(ch=='=')
optr.add(newWord(">=",18));
elseif(ch=='>')
optr.add(newWord(">>",20));
else
{
index--;
optr.add(newWord(">",18));
}
}
//小于或小于等于或左移
elseif(ch=='<')
{
ch=exp.charAt(index);
index++;
if(ch=='=')
optr.add(newWord("<=",18));
elseif(ch=='<')
optr.add(newWord("<<",20));
else
{
index--;
optr.add(newWord("<",18));
}
}
//赋值或等于
elseif(ch=='=')
{
ch=exp.charAt(index);
index++;
if(ch=='=')
optr.add(newWord("==",18));
else
{
index--;
optr.add(newWord("=",16));
}
}
//或运算按位或
elseif(ch=='|')
{
ch=exp.charAt(index);
index++;
if(ch=='|')
optr.add(newWord("||",17));
else
{
index--;
optr.add(newWord("|",20));
}
}
//与运算
elseif(ch=='&')
{
ch=exp.charAt(index);
index++;
if(ch=='&')
optr.add(newWord("&&",17));
else
{
index--;
optr.add(newWord("&",20));
}
}
//非运算或不等于
elseif(ch=='!')
{
ch=exp.charAt(index);
index++;
if(ch=='=')
optr.add(newWord("!=",18));
else
{
index--;
optr.add(newWord("!",21));
}
}
//按位亦或
elseif(ch=='^')
optr.add(newWord("^",20));
//取模运算
elseif(ch=='%')
optr.add(newWord("%",20));
//左括号
elseif(ch=='(')
optr.add(newWord("(",22));
//右括号
elseif(ch==')')
optr.add(newWord(")",23));
//左大括号
elseif(ch=='{')
optr.add(newWord("{",24));
//右大括号
elseif(ch=='}')
optr.add(newWord("}",25));
//结束扫描标志为:#?e_N_d?#
elseif(ch==' ')
{
break;
}
elseif(ch=='#')
{
inttIndex=index-1;
if(exp.length()>tIndex+9)
{
Stringend=exp.substring(tIndex,tIndex+9);
if(end.equals("#?e_N_d?#"))
{
optr.add(newWord("#",27));
break;
}
}
else
{
System.out.println("非法符号'#'后的语句忽略!");
optr.add(newWord("#",27));
break;
}
}
//清空扫描串
strToken.setLength(0);
}
returnoptr;
}
}

2. 请用JAVA编程输入一个语句进行词法分析

我最近正在学编译原理,我有c语言实现的词法分析程序,不知可不可以,识别的是TEST语言的单词。

#include<stdio.h>

#include<ctype.h>

#include<string.h>


#define keywordSum 8


char * keyword[keywordSum] = {"do", "else", "for", "if", "int", "read", "while", "write"};

char singleword[50] = "+-*(){};,:";

char doubleword[10] = "><=!|&";


char Scanin[300], Scanout[300];

FILE * fin, * fout;


int binaryFind(int low, int high, char * c1, char ** c2) {


int mid;

if(low > high) return -1;

mid = (low+high)/2;

if(strcmp(c1, c2[mid]) == 0) return mid;

else if(strcmp(c1, c2[mid]) > 0) return binaryFind(mid+1, high, c1, c2);

else return binaryFind(low, mid-1, c1, c2);

}


int TESTscan() {


char ch, token[40];

int es = 0, j, n;


printf("请输入源文件名(包括路径):");

scanf("%s", Scanin);

printf("请输入词法分析输出文件名(包括路径):");

scanf("%s", Scanout);


if((fin=fopen(Scanin, "r")) == NULL) {

printf(" 打开词法分析输入文件出错! ");

return 1;

}

if((fout=fopen(Scanout, "w")) == NULL) {

printf(" 创建词法分析输出文件出错! ");

return 2;

}


// printf("%c", getc(fin));


ch = getc(fin);


while(ch != EOF) {


while(ch==' ' || ch==' ' || ch==' ') {

ch = getc(fin);

}


if(isalpha(ch)) { //标识符


token[0] = ch;

j = 1;

ch = getc(fin);

while(isalnum(ch)) { //判断当前字符是否是字母或数字

token[j++] = ch;

ch = getc(fin);

}

token[j] = '';

// printf("%s", token);

n = binaryFind(0, keywordSum-1, token, keyword);

if(n < 0 ) {

fprintf(fout, "%s %s ", "ID", token);

} else {

fprintf(fout, "%s %s ", token, token);

}


} else if(isdigit(ch)) { //数字


token[0] = ch;

j = 1;

ch = getc(fin);

while(isdigit(ch)) {

token[j++] = ch;

ch = getc(fin);

}

token[j] = '';


fprintf(fout, "%s %s ", "NUM", token);


} else if(strchr(singleword, ch) > 0) { //singleword


token[0] = ch;

token[1] = '';

ch = getc(fin);


fprintf(fout, "%s %s ", token, token);


} else if(strchr(doubleword, ch) > 0) { //doubleword


token[0] = ch;

ch = getc(fin);


if(ch=='=' && (token[0]=='>'||token[0]=='<' || token[0] == '!')) {

token[1] = ch;

token[2] = '';

ch = getc(fin);

} else if((ch=='&')||(ch=='|')||(ch=='=') && ch==token[0]) {

token[1] = ch;

token[2] = '';

ch = getc(fin);

} else {

token[1] = '';

}


fprintf(fout, "%s %s ", token, token);


} else if(ch == '/') { //注释


ch = getc(fin);


if(ch == '*') {

char ch1;

ch1 = getc(fin);

do {

ch = ch1;

ch1 = getc(fin);

} while((ch!='*'||ch1!='/') && ch1!=EOF);


ch = getc(fin);


} else {

token[0] = '/';

token[1] = '';

fprintf(fout, "%s %s ", token, token);

}


} else {


token[0] = ch;

token[1] = '';

ch = getc(fin);

es = 3;


fprintf(fout, "%s %s ", "ERROR", token);

}

}


fclose(fin);

fclose(fout);


return es;


}


void main() {


int es = 0;

es = TESTscan();

if(es > 0) {

printf("词法分析有错, 编译停止! ");

} else {

printf("词法分析成功! ");

}


}

3. 怎么用java写一个词法分析器

首先看下我们要分析的代码段如下:

输出结果(c).PNG

括号里是一个二元式:(单词类别编码,单词位置编号)

代码如下:

?

1234567891011121314package Yue.LexicalAnalyzer;import java.io.*;/** 主程序*/public class Main {public static void main(String[] args) throws IOException {Lexer lexer = new Lexer();lexer.printToken();lexer.printSymbolsTable();}}

?

package Yue.LexicalAnalyzer;import java.io.*;import java.util.*;/** 词法分析并输出*/public class Lexer {/*记录行号*/public static int line = 1;/*存放最新读入的字符*/char character = ' ';/*保留字*/Hashtable<String, KeyWord> keywords = new Hashtable<String, KeyWord>();/*token序列*/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;}/*打印tokens序列*/public void printToken() throws IOException {FileWriter writer = new FileWriter("E:\lex.txt");System.out.println("词法分析结果如下:");System.out.print("杜悦-2015220201031 ");writer.write("杜悦-2015220201031 ");while (getReaderState() == false) {Token tok = scan();String str = "line " + tok.line + " (" + tok.tag + "," + tok.pos + ") "+ tok.name + ": " + tok.toString() + " ";writer.write(str);System.out.print(str);}writer.flush();}/*打印符号表*/public void printSymbolsTable() throws IOException {FileWriter writer = new FileWriter("E:\symtab1.txt");System.out.print(" 符号表 ");System.out.print("编号 行号 名称 ");writer.write("符号表 ");writer.write("编号 " + " 行号 " + " 名称 ");Iterator<Symbol> e = symtable.iterator();while (e.hasNext()) {Symbol symbol = e.next();String desc = symbol.pos + " " + symbol.line + " " + symbol.toString();System.out.print(desc + " ");writer.write(desc + " ");}writer.flush();}/*打印错误*/public void printError(Token tok) throws IOException{FileWriter writer = new FileWriter("E:\error.txt");System.out.print(" 错误词法如下: ");writer.write("错误词法如下: ");String str = "line " + tok.line + " (" + tok.tag + "," + tok.pos + ") "+ tok.name + ": " + tok.toString() + " ";writer.write(str);}/*添加保留字*/void reserve(KeyWord w) {keywords.put(w.lexme, w);}public Lexer() {/*初始化读取文件变量*/try {reader = new BufferedReader(new FileReader("E:\输入.txt"));} catch (IOException e) {System.out.print(e);}/*添加保留字*/this.reserve(KeyWord.begin);this.reserve(KeyWord.end);this.reserve(KeyWord.integer);this.reserve(KeyWord.function);this.reserve(KeyWord.read);this.reserve(KeyWord.write);this.reserve(KeyWord.aIf);this.reserve(KeyWord.aThen);this.reserve(KeyWord.aElse);}/*按字符读*/public void readch() throws IOException {character = (char) reader.read();if ((int) character == 0xffff) {this.isEnd = true;}}/*判断是否匹配*/public Boolean readch(char ch) throws IOException {readch();if (this.character != ch) {return false;}this.character = ' ';return true;}/*数字的识别*/public Boolean isDigit() throws IOException {if (Character.isDigit(character)) {int value = 0;while (Character.isDigit(character)) {value = 10 * value + Character.digit(character, 10);readch();}Num n = new Num(value);n.line = line;tokens.add(n);return true;} elsereturn false;}/*保留字、标识符的识别*/public Boolean isLetter() throws IOException {if (Character.isLetter(character)) {StringBuffer sb = new StringBuffer();/*首先得到整个的一个分割*/while (Character.isLetterOrDigit(character)) {sb.append(character);readch();}/*判断是保留字还是标识符*/String s = sb.toString();KeyWord w = keywords.get(s);/*如果是保留字的话,w不应该是空的*/if (w != null) {w.line = line;tokens.add(w);} else {/*否则就是标识符,此处多出记录标识符编号的语句*/Symbol sy = new Symbol(s);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);}return true;} elsereturn false;}/*符号的识别*/public Boolean isSign() throws IOException {switch (character) {case '#':readch();AllEnd.allEnd.line = line;tokens.add(AllEnd.allEnd);return true;case ' ':if (readch(' ')) {readch();LineEnd.lineEnd.line = line;tokens.add(LineEnd.lineEnd);line++;return true;}case '(':readch();Delimiter.lpar.line = line;tokens.add(Delimiter.lpar);return true;case ')':readch();Delimiter.rpar.line = line;tokens.add(Delimiter.rpar);return true;case ';':readch();Delimiter.sem.line = line;tokens.add(Delimiter.sem);return true;case '+':readch();CalcWord.add.line = line;tokens.add(CalcWord.add);return true;case '-':readch();CalcWord.sub.line = line;tokens.add(CalcWord.sub);return true;case '*':readch();CalcWord.mul.line = line;tokens.add(CalcWord.mul);return true;case '/':readch();CalcWord.div.line = line;tokens.add(CalcWord.div);return true;case ':':if (readch('=')) {readch();CalcWord.assign.line = line;tokens.add(CalcWord.assign);return true;}break;case '>':if (readch('=')) {readch();CalcWord.ge.line = line;tokens.add(CalcWord.ge);return true;}break;case '<':if (readch('=')) {readch();CalcWord.le.line = line;tokens.add(CalcWord.le);return true;}break;case '!':if (readch('=')) {readch();CalcWord.ne.line = line;tokens.add(CalcWord.ne);return true;}break;}return false;}/*下面开始分割关键字,标识符等信息*/public Token scan() throws IOException {Token tok;while (character == ' ')readch();if (isDigit() || isSign() || isLetter()) {tok = tokens.get(tokens.size() - 1);} else {tok = new Token(character);printError(tok);}return tok;}}

4. 编译原理课程设计词法分析器设计(java实现)

参考答案 永远对生活充满希望,对于困境与磨难,微笑面对。

5. 关于java编译器中词法分析,语法分析,语义分析

请采纳

6. Java代码到底是如何编译成机器指令的

编译器把一种语言规范转化为另一种语言规范的这个过程需要哪些步骤?回答这个问题需要参照《编译原理》,总结过程如下:

        1)词法分析:读取源代码,一个字节一个字节的读进来,找出这些词法中我们定义的语言关键词如:if、else、while等,识别哪些if是合法的哪些是不合法的。这个步骤就是词法分析过程。

        词法分析的结果:就是从源代码中找出了一些规范化的token流,就像人类语言中,给你一句话你要分辨出哪些是一个词语,哪些是标点符号,哪些是动词,哪些是名词。

        2)语法分析:就是对词法分析中得到的token流进行语法分析,这一步就是检查这些关键词组合在一起是不是符合Java语言规范。如if的后面是不是紧跟着一个布尔型判断表达式。

        语法分析的结果:就是形成一个符合Java语言规定的抽象语法树,抽象语法树是一个结构化的语法表达形式,它的作用是把语言的主要词法用一个结构化的形式组织在一起。这棵语法树可以被后面按照新的规则再重新组织。

        3)语义分析:语法分析完成之后也就不存在语法问题了,语义分析的主要工作就是把一些难懂的,复杂的语法转化成更简单的语法。就如难懂的文言文转化为大家都懂的百话文,或者是注释一下一些不懂的成语。

        语义分析结果:就是将复杂的语法转化为简单的语法,对应到Java就是将foreach转化为for循环,还有一些注释等。最后生成一棵抽象的语法树,这棵语法树也就更接近目标语言的语法规则。

        4)字节码生成:将会根据经过注释的抽象语法树生成字节码,也就是将一个数据结构转化为另外一个数据结构。就像将所有的中文词语翻译成英文单词后按照英文语法组装文英文语句。代码生成器的结果就是生成符合java虚拟机规范的字节码。

热点内容
魔兽世界自动钓鱼脚本 发布:2024-05-19 06:43:07 浏览:494
cbs加密 发布:2024-05-19 06:29:56 浏览:200
ssis存储过程 发布:2024-05-19 06:21:31 浏览:630
怎样删除小视频文件夹 发布:2024-05-19 05:49:29 浏览:589
开启php短标签 发布:2024-05-19 05:44:12 浏览:473
android各国语言 发布:2024-05-19 05:42:54 浏览:247
微信什么资料都没怎么找回密码 发布:2024-05-19 05:35:34 浏览:907
填志愿密码是什么 发布:2024-05-19 05:30:23 浏览:318
城堡争霸自动掠夺脚本 发布:2024-05-19 05:22:06 浏览:204
asp编程工具 发布:2024-05-19 05:20:36 浏览:143