编译原理 TINY语言 词法分析 语法分析
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
if (reader.ViewOne() == '=')
南京信息工程大学 编译原理 课程设计 8 / 12
{ reader.Read(); result.Add(new Token(row, col, TokenType.Assign, ":="));
} else
result.Add(new Token(row, col, TokenType.Error, ":")); break; case '+': result.Add(new Token(row, col, TokenType.Plus, "+")); break; case '-': result.Add(new Token(row, col, TokenType.Minus, "-")); break; case '*': result.Add(new Token(row, col, TokenType.Mul, "*")); break; case '/': result.Add(new Token(row, col, TokenType.Div, "/")); break; case '=': result.Add(new Token(row, col, TokenType.Equal, "=")); break; case '<': result.Add(new Token(row, col, TokenType.LessThan, "<")); break; case ';': result.Add(new Token(row, col, TokenType.Semicolon, ";")); break; case '(': result.Add(new Token(row, col, TokenType.LeftBracket, "(")); break; case ')': result.Add(new Token(row, col, TokenType.RightBracket, ")")); break; case '{': while (reader.ViewOne() != '\0' && reader.ViewOne() != '}') {
关键字
if then else end repeat until read write
标识符(Identifier)
[a-zA-Z][a-zA-Z0-9]*
数字(Number)
[0-9]+
运算符
+ - * / < = :=
分隔符
;()
注释
{和}之间的内容为 TINY 源代码中的注释
文法
Program →
token.Append(ch); reader.Read(); } string data = token.ToString(); result.Add(new Token(row, col, Definition.GetWordType(data), data)); } else if (isDigit(ch)) { token.Append(ch); while ((ch = reader.ViewOne()) != '\0' && isDigit(ch)) { token.Append(ch); reader.Read(); } result.Add(new Token(row, col, TokenType.Number, token.ToString())); } else switch (ch) { case ':':
南京信息工程大学 编译原理 课程设计 2 / 12
一、设计题目:
根据给定的 TINY 语言规范,为 TINY 语言设计编译器,要求完成 TINY 语言的词法分析和语法分析部分。
二、课题解析
词法分析 词法分析的主要任务是:输入源程序,对构成源程序的字符串扫描和分解,识别出一个个的单词,如关 键字、标识符、数字、运算符等等。 词法分析要完成的工作有:
南京信息工程大学 编译原理 课程设计 3 / 12
五、实验截图
南京信息工程大学 编译原理 课程设计 4 / 12
南京信ຫໍສະໝຸດ Baidu工程大学 编译原理 课程设计 5 / 12
六、运行结果分析
本课程设计完成了课题的要求,能够对用户输入的 YINY 源代码进行词法分析和语法分析,并能提供 检错功能,提示用户错误发生在源代码的何处。
三、算法说明
本课程设计完成了处理 TINY 语言的词法分析和语法分析部分。 词法分析部分,根据 TINY 语言的定义,构造出识别 TINY 语言 Token 的 DFA m,在此基础上进行编 程,完成词法分析工作。词法分析结果为一个 Token 串,包括 Token 所在行、所在列、Token 类型和 Token 值。 语法分析部分,根据 TINY 语言的文法,初始化程序的过程中。导入 TINY 语言文法,根据文法识别出 TINY 语言的终结符(NT)和非终结符(VT)。消除文法的左递归,提取左公因子,初始化 First 集合 Follow 集, 构造 LL1 分析表,采用自顶向下的分析方法进行语法分析。若输入的 Token 串符合文法的定义,则给出语 法树;否则指出错误所在的地方,并在已经生成的语法树中表示出相应的出错地点。
过滤掉源程序中的空白字符和注释,因为这些信息仅增加了源程序的可读性,便于程序员阅读 和维护源代码,而对语法分析是完全无用的。
识别各种常量,并且把字符形式的表示翻译成编译器的内部表示。 识别标识符和关键字。 识别源程序中德各种符号。 语法分析 语法分析的主要任务是接收词法分析程序识别出来的单词符号串,判断它们是否由某种语言的文法产 生,即判断被识别符号串是否为某种语法成分。除此之外,还要进行语法检查,为后面的语义分析和代码生 成做准备。 通过语法分析,可以建立相应的语法树。根据建立语法树方式的不同,可以把语法分析过程分为两大 类,即自顶向下和自底向上的分析法。自顶向下的语法分析过程是沿着树根到树叶的方向建立,而自底向上 的方法则是沿着从树叶到树根的方向建立。
stmt-sequence →
statement →
if-stmt
→
repeat-stmt →
assign-stmt →
read-stmt →
write-stmt →
exp
→
comparison-op→
simple-exp →
addop
→
term
→
mulop
→
factor
→
stmt-sequence stmt-sequence ;statement | statement if-stmt | repeat-stmt | assign-stmt | read-stmt | write-stmt if exp then stmt-sequence end | if exp then stmt-sequence else stmt-sequence end repeat stmt-sequence until exp identifier := exp read identifier write exp simple-exp comparison-op simple-exp | simple-exp <|= simple-exp addop term | term +|term mulop factor | factor *|/ ( exp ) | Number | Identifier
南京信息工程大学 编译原理 课程设计 7 / 12
附录二:部分程序源代码
词法分析部分
public static List<Token> GetResult(string SourceCode) {
List<Token> result = new List<Token>(); SourceReader reader = new SourceReader(SourceCode); char ch; StringBuilder token; int row, col; while ((ch = reader.Read()) != '\0') {
词法分析 ..................................................................................................................................................... 3 语法分析 ..................................................................................................................................................... 3 三、算法说明 ............................................................................................................................................................. 3 四、相关数据结构 ..................................................................................................................................................... 3 五、实验截图 ............................................................................................................................................................. 4 六、运行结果分析 ..................................................................................................................................................... 6 七、收获和体会 ......................................................................................................................................................... 6 七、附录一:TINY 语言文法规范........................................................................................................................... 7 八、附录二:部分程序源代码 ................................................................................................................................. 8
七、收获和体会
通过这次课程设计,加深了对编译原理的理解,了解了编译器的构造,能实验简单的编译器前段,对以 后的学习很有帮助。
南京信息工程大学 编译原理 课程设计 6 / 12
附录一:TINY 语言文法规范
字符集
ABCDEFGHJKLMNOPQRSTUVWXYZabcdefghjklmnopqrs tuvwxyz0123456789:=;()+-*/<{}
row = reader.Row; col = reader.Col; token = new StringBuilder(); if (isLetter(ch)) {
token.Append(ch); while ((ch = reader.ViewOne()) != '\0' && isLetterOrDigit(ch)) {
编译原理
课程设计
题 目 TINY 语言词法分析语法分析
学生姓名 学号 院系 指导教师
54andy1@163.com 计算机与软件学院
年月 日
目录
一、设计题目: ......................................................................................................................................................... 3 二、课题解析 ............................................................................................................................................................. 3
四、相关数据结构
class Token //单词
{ int Row;//单词所在行 int Col;//单词所在列 TokenTypes Type;//单词类型 int Value//单词值
}
class TINYNode //语法树中一个单词节点 {
String Data;//单词值 List<TINYNode> Children;//子节点 }
南京信息工程大学 编译原理 课程设计 8 / 12
{ reader.Read(); result.Add(new Token(row, col, TokenType.Assign, ":="));
} else
result.Add(new Token(row, col, TokenType.Error, ":")); break; case '+': result.Add(new Token(row, col, TokenType.Plus, "+")); break; case '-': result.Add(new Token(row, col, TokenType.Minus, "-")); break; case '*': result.Add(new Token(row, col, TokenType.Mul, "*")); break; case '/': result.Add(new Token(row, col, TokenType.Div, "/")); break; case '=': result.Add(new Token(row, col, TokenType.Equal, "=")); break; case '<': result.Add(new Token(row, col, TokenType.LessThan, "<")); break; case ';': result.Add(new Token(row, col, TokenType.Semicolon, ";")); break; case '(': result.Add(new Token(row, col, TokenType.LeftBracket, "(")); break; case ')': result.Add(new Token(row, col, TokenType.RightBracket, ")")); break; case '{': while (reader.ViewOne() != '\0' && reader.ViewOne() != '}') {
关键字
if then else end repeat until read write
标识符(Identifier)
[a-zA-Z][a-zA-Z0-9]*
数字(Number)
[0-9]+
运算符
+ - * / < = :=
分隔符
;()
注释
{和}之间的内容为 TINY 源代码中的注释
文法
Program →
token.Append(ch); reader.Read(); } string data = token.ToString(); result.Add(new Token(row, col, Definition.GetWordType(data), data)); } else if (isDigit(ch)) { token.Append(ch); while ((ch = reader.ViewOne()) != '\0' && isDigit(ch)) { token.Append(ch); reader.Read(); } result.Add(new Token(row, col, TokenType.Number, token.ToString())); } else switch (ch) { case ':':
南京信息工程大学 编译原理 课程设计 2 / 12
一、设计题目:
根据给定的 TINY 语言规范,为 TINY 语言设计编译器,要求完成 TINY 语言的词法分析和语法分析部分。
二、课题解析
词法分析 词法分析的主要任务是:输入源程序,对构成源程序的字符串扫描和分解,识别出一个个的单词,如关 键字、标识符、数字、运算符等等。 词法分析要完成的工作有:
南京信息工程大学 编译原理 课程设计 3 / 12
五、实验截图
南京信息工程大学 编译原理 课程设计 4 / 12
南京信ຫໍສະໝຸດ Baidu工程大学 编译原理 课程设计 5 / 12
六、运行结果分析
本课程设计完成了课题的要求,能够对用户输入的 YINY 源代码进行词法分析和语法分析,并能提供 检错功能,提示用户错误发生在源代码的何处。
三、算法说明
本课程设计完成了处理 TINY 语言的词法分析和语法分析部分。 词法分析部分,根据 TINY 语言的定义,构造出识别 TINY 语言 Token 的 DFA m,在此基础上进行编 程,完成词法分析工作。词法分析结果为一个 Token 串,包括 Token 所在行、所在列、Token 类型和 Token 值。 语法分析部分,根据 TINY 语言的文法,初始化程序的过程中。导入 TINY 语言文法,根据文法识别出 TINY 语言的终结符(NT)和非终结符(VT)。消除文法的左递归,提取左公因子,初始化 First 集合 Follow 集, 构造 LL1 分析表,采用自顶向下的分析方法进行语法分析。若输入的 Token 串符合文法的定义,则给出语 法树;否则指出错误所在的地方,并在已经生成的语法树中表示出相应的出错地点。
过滤掉源程序中的空白字符和注释,因为这些信息仅增加了源程序的可读性,便于程序员阅读 和维护源代码,而对语法分析是完全无用的。
识别各种常量,并且把字符形式的表示翻译成编译器的内部表示。 识别标识符和关键字。 识别源程序中德各种符号。 语法分析 语法分析的主要任务是接收词法分析程序识别出来的单词符号串,判断它们是否由某种语言的文法产 生,即判断被识别符号串是否为某种语法成分。除此之外,还要进行语法检查,为后面的语义分析和代码生 成做准备。 通过语法分析,可以建立相应的语法树。根据建立语法树方式的不同,可以把语法分析过程分为两大 类,即自顶向下和自底向上的分析法。自顶向下的语法分析过程是沿着树根到树叶的方向建立,而自底向上 的方法则是沿着从树叶到树根的方向建立。
stmt-sequence →
statement →
if-stmt
→
repeat-stmt →
assign-stmt →
read-stmt →
write-stmt →
exp
→
comparison-op→
simple-exp →
addop
→
term
→
mulop
→
factor
→
stmt-sequence stmt-sequence ;statement | statement if-stmt | repeat-stmt | assign-stmt | read-stmt | write-stmt if exp then stmt-sequence end | if exp then stmt-sequence else stmt-sequence end repeat stmt-sequence until exp identifier := exp read identifier write exp simple-exp comparison-op simple-exp | simple-exp <|= simple-exp addop term | term +|term mulop factor | factor *|/ ( exp ) | Number | Identifier
南京信息工程大学 编译原理 课程设计 7 / 12
附录二:部分程序源代码
词法分析部分
public static List<Token> GetResult(string SourceCode) {
List<Token> result = new List<Token>(); SourceReader reader = new SourceReader(SourceCode); char ch; StringBuilder token; int row, col; while ((ch = reader.Read()) != '\0') {
词法分析 ..................................................................................................................................................... 3 语法分析 ..................................................................................................................................................... 3 三、算法说明 ............................................................................................................................................................. 3 四、相关数据结构 ..................................................................................................................................................... 3 五、实验截图 ............................................................................................................................................................. 4 六、运行结果分析 ..................................................................................................................................................... 6 七、收获和体会 ......................................................................................................................................................... 6 七、附录一:TINY 语言文法规范........................................................................................................................... 7 八、附录二:部分程序源代码 ................................................................................................................................. 8
七、收获和体会
通过这次课程设计,加深了对编译原理的理解,了解了编译器的构造,能实验简单的编译器前段,对以 后的学习很有帮助。
南京信息工程大学 编译原理 课程设计 6 / 12
附录一:TINY 语言文法规范
字符集
ABCDEFGHJKLMNOPQRSTUVWXYZabcdefghjklmnopqrs tuvwxyz0123456789:=;()+-*/<{}
row = reader.Row; col = reader.Col; token = new StringBuilder(); if (isLetter(ch)) {
token.Append(ch); while ((ch = reader.ViewOne()) != '\0' && isLetterOrDigit(ch)) {
编译原理
课程设计
题 目 TINY 语言词法分析语法分析
学生姓名 学号 院系 指导教师
54andy1@163.com 计算机与软件学院
年月 日
目录
一、设计题目: ......................................................................................................................................................... 3 二、课题解析 ............................................................................................................................................................. 3
四、相关数据结构
class Token //单词
{ int Row;//单词所在行 int Col;//单词所在列 TokenTypes Type;//单词类型 int Value//单词值
}
class TINYNode //语法树中一个单词节点 {
String Data;//单词值 List<TINYNode> Children;//子节点 }