武汉理工大学编译原理实验报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Token
token
=
new
Token(TokenTable.getTokenType(delimiter), delimiter);
tokens.add(token);
}
Байду номын сангаас
// 以下都是运算符..
// 运算符"<"或"<="
else if (line.charAt(i) == '<')
{
index = i + 1;
: (delimiterTable.containsKey(key) ? delimiterTable.get(key)
: (keywordTable.containsKey(key) ? keywordTable.get(key)
:
(identifierOrNumberTable.containsKey(key)
即对源程序从左到右进行扫描,对组成源程序的字符串拼接成为单词;并把其转换成属性字输 出。 3.实验要求: (1)选择常用高级程序设计语言(如 Pascal、C 语言、PL/0 语言)的源程序作为词法分析对 象。 (2)根据教学要求和学生具体情况,从上列语言之一中选取它的一个适当大小的子集,可以 选取一类典型单词,也可以尽可能使各种类型的单词都能兼顾到。其基本要求是:对源程序从 左到右进行扫描,对组成源程序的字符串拼接成为单词;并把其转换成属性字输出。
{
if (!error && Character.isLetter(line.charAt(index)))
{
error = true;
}
index++;
}
String tokenType = error ? "error" : "number";
Token
token
=
new
Token(TokenTable.getTokenType(tokenType), line.substring(i, index));
public static boolean containsKeyword(String keyword) {
return keywordTable.containsKey(keyword); }
public static boolean containsDelimiter(String delimiter) {
}
-4-
i = index - 1;
}
// 整型非负数值
else if (Character.isDigit(line.charAt(i)))
{
index = i + 1;
boolean error = false;
while
(index
<
line.length()
&&
Character.isLetterOrDigit(line.charAt(index)))
TokenTable.java: public class TokenTable {
private static HashMap<String, Integer> identifierOrNumberTable = new HashMap<>(); // 标识符或数值-标识符或数值种别码
private static HashMap<String, Integer> keywordTable = new HashMap<>(); // 关键字-关键字种别码
-2-
delimiterTable.put(";", 25); operatorTable.put("<", 26); operatorTable.put("<=", 27); operatorTable.put(">", 28); operatorTable.put(">=", 29); operatorTable.put("==", 30); operatorTable.put("=", 31); operatorTable.put("+", 32); operatorTable.put("-", 33); operatorTable.put("*", 34); operatorTable.put("/", 35); operatorTable.put("+=", 36); operatorTable.put("-=", 37); operatorTable.put("*=", 38); operatorTable.put("/=", 39); }
?
identifierOrNumberTable.get(key)
: null)));
}
}
Lexer.java: public interface Lexer {
/** * 对给定路径的文本文件中的文本,进行词法分析,返回可迭代的单词 * 集合。 * @param path 要进行词法分析的文本文件的路径
{
index = i + 1;
while
(index
<
line.length()
&&
Character.isLetterOrDigit(line.charAt(index)))
{
index++;
}
String key = line.substring(i, index);
if (TokenTable.containsKeyword(key))
return delimiterTable.containsKey(delimiter); }
public static Integer getTokenType(String key)
{
return operatorTable.containsKey(key) ? operatorTable.get(key)
@Override public List<Token> scan(String path) throws Exception {
List<Token> tokens = new ArrayList<>();
Path file = Paths.get(path);
BufferedReader in = Files.newBufferedReader(file);
static {
identifierOrNumberTable.put("error", 0); identifierOrNumberTable.put("identifier", 1); identifierOrNumberTable.put("number", 2); keywordTable.put("char", 3); keywordTable.put("int", 4); keywordTable.put("float", 5); keywordTable.put("double", 6); keywordTable.put("void", 7); keywordTable.put("main", 8); keywordTable.put("if", 9); keywordTable.put("else", 10); keywordTable.put("for", 11); keywordTable.put("while", 12); keywordTable.put("do", 13); keywordTable.put("switch", 14); keywordTable.put("break", 15); keywordTable.put("continue", 16); keywordTable.put("return", 17); delimiterTable.put("{", 18); delimiterTable.put("}", 19); delimiterTable.put("[", 20); delimiterTable.put("]", 21); delimiterTable.put("(", 22); delimiterTable.put(")", 23); delimiterTable.put(",", 24);
学生学号
实验课成绩
武汉理工大学
学生实验报告书
实验课程名称 开课学院 指导老师姓名 学生姓名 学生专业班级
编译原理 计算机科学与技术学院
饶文碧
软件 zy1302
2015 — 2016 学年 第 1 学期
实验课程名称: 编译原理
实验项目名称 实验者 同组者
单词的词法分析程序设计
实验成绩
专业班级 软件 zy1302 组别
private static HashMap<String, Integer> delimiterTable = new HashMap<>(); // 界符-界符种别码
private static HashMap<String, Integer> operatorTable = new HashMap<>(); // 运算符-运算符种别码
tokens.add(token);
i = index - 1;
}
// 界符
else
if
(TokenTable.containsDelimiter(String.valueOf(line.charAt(i))))
{
String delimiter = String.valueOf(line.charAt(i));
实验日期 2015 年 12 月 29 日
第一部分:实验分析与设计(可加页)
一、实验内容描述(问题域描述)
1.问题描述: 对于常用高级语言(如 Pascal、C 语言)的各类单词进行词法分析。
2.实验内容: 完成对某一种常用高级语言(如 Pascal、C 语言、PL/0 语言)的各类单词进行词法分析,
二、实验设计(包括实验方案设计,实验手段的确定,实验步骤,实验过程等,用 硬件逻辑或者算法描述 )
Token.java: public class Token {
private int tokenType; // 单词种别码 private String tokenValue; // 单词值
public Token(int tokenType, String tokenValue) {
this.tokenType = tokenType; this.tokenValue = tokenValue; }
public int getTokenType() {
return tokenType; }
-1-
public String getTokenValue() {
return tokenValue; } }
-3-
* @return 可迭代的单词集合 * @throws Exception 抛出所有异常(这么做是为了代码清晰,唉) */ Iterable<Token> scan(String path) throws Exception; }
LexerImpl.java: public class LexerImpl implements Lexer {
String line;
while ((line = in.readLine()) != null)
{
int index = 0; // 若单词是一个以上的字符组成,此下标就会起作用
for (int i = 0; i < line.length(); i++)
{
// 标识符或关键字
if (Character.isLetter(line.charAt(i)))
{
Token token = new Token(TokenTable.getTokenType(key),
key);
tokens.add(token);
}
else
{
Token
token
=
new
Token(TokenTable.getTokenType("identifier"), key);
tokens.add(token);
tokens.add(token);
-5-
i = index;
}
else
{
String lessThan = (line.substring(i, index));
Token
token
=
new
Token(TokenTable.getTokenType(lessThan), lessThan);
if (line.charAt(index) == '=')
{
String lessThanOrEqual = line.substring(i, index + 1);
Token
token
=
new
Token(TokenTable.getTokenType(lessThanOrEqual), lessThanOrEqual);
相关文档
最新文档