词法分析器代码分析报告

词法分析器代码分析报告

一、词法分析器设计思路说明

该词法分析器基于状态转换图进行设计。首先画出识别特定单词的状态转换图并编写对应的单词识别程序,然后把不同的状态转换图合并为完整的状态转换图,并编写对应的完整的识别程序。完整的识别程序中,根据输入字符的不同调
用识别不同单词的程序。
转态图

  1. 1.数字的状态图
    在这里插入图片描述
  2. 运算符的状态图
    在这里插入图片描述
  3. 关键字的转态图
    在这里插入图片描述
  4. 字符串转态转化图
    在这里插入图片描述
  5. 删除注释
    在这里插入图片描述
  6. 总状态图
    在这里插入图片描述
    单词识别过程:
    以/zzt/为例,首先识别/会进入消除注释转换机,并且继续往下读取字符当识别到/时消除注释识别完毕。

二、TinyScript的词法要求

1.给出TinyScript的字符集
[a-zA-Z]$和^[0-9]$和[_a-zA-Z0-9]KaTeX parse error: Expected 'EOF', got '&' at position 13: 和^[*+\\-<>=!&̲|^%/,]
2.列出TinyScript中的关键字
“var”,“int”,“float”,“bool”,“void”,“string”,“if”,“else”,“for”,“while”,“break”,“func”,“return”
3.列出TinyScript中的运算符
,“++”, “+=”, “+”, “–”, “-=”, “-”, “=", "”, “/=”, “/”, “>=”, “>>”, “>”, “<=”, “<<”, “<”, “==”, “=”, “!=”, “!”, “&&”, “&=”, “&”, “||”, “|=”, “|”, “^^”, “^=”, “^”, “%=”, “%”

三、词法分析器代码分析

词法分析器包括commom和lexer两个包,分别分析如下。

1.common包**

common包内的类分析如下。
(1)AlphabetHelper类
AlphabetHelper类的主要作用是定义TinyScript语言的字母表,包含以下4个属性和4个方法。

ptnLetter属性
ptnLetter是Pattern类型的模式串,用于匹配单个字母,可以是大写字母或小写字母。

ptnNumber属性
ptnNumber是Pattern类型的模式串,用于匹配0-9中的单个数字。

ptnLiteral属性
ptnNumber是Pattern类型的模式串,用于匹配变量名。

ptnOperator属性
ptnOperator是Pattern类型的模式串,用于匹配运算符。

isLetter()方法
isLetter(char c)返回boolean类型的结果,用于判断参数c是否为字母。

isNumber()方法
isLetter(char c)返回boolean类型的结果,用于判断参数c是否为数字。

isLiteral()方法
isLetter(char c)返回boolean类型的结果,用于判断参数c是否为变量名。

isOperator()方法
isLetter(char c)返回boolean类型的结果,用于判断参数c是否为运算符。

(2)PeekIterator类
PeekIterator类的主要作用是定义TinyScript语言对输入符的操作,有5个属性和7个方法。

it属性
it属性是Iterator类型的变量,用来存储输入的字符串。

queueCache属性
queueCache属性是LinkedList类型,作用为缓存队列作为正在处理的字符执行窗口。

stackPutBacks属性
stackPutBacks属性是LinkedList类型,作用为缓存栈存已经处理过的n字符。

CACHE_SIZE属性
CACHE_SIZE属性是int类型常量,用来缓存窗口的大小。

_endToken属性
_endToken属性可以为任何类型,用来存放结束符。

PeekIterator()方法
PeekIterator()方法,用来赋值的方法参数为Stream对象类型。

PeekIterator()方法
PeekIterator()方法,用来赋值的方法参数为Iterator _it, T endToke。

PeekIterator()方法
PeekIterator()方法,用来赋值的方法参数为Stream stream, T endToken。

Peek()方法
Peek()方法,用来实现取下一个字符但是当前字符不会被删除,返回值可以为任何类型。

putBack()方法
putBack()方法,用来将缓存倒置,无返回值。

hasNext()方法
hasNext()方法,用来判断是否还有未处理的字符,返回值为boolean类型。

next()方法
next()方法,用来取出下一个未处理字符,并且删除他,返回值可以为任何类型。

2.lexer包**

lexer包内的分析如下。
(1)Keywords类
Keywords类的主要作用为保留关键字的定义,并且判断是否为关键字,类中包含2个属性和1个方法。

keywords属性
keywords属性是String类型的数组,用来存储关键字。

set属性
set属性是HashSet类型的集合。

isKeyword()方法
isKeyword()方法,用来判断字符串是否为关键字,返回值为boolean类型。

(2)Lexer类
Lexer类的作用为进行词法分析,包含3个方法。

Analyse()方法
Analyse()方法,用来判断输入的词属于哪种类型,并且调用对应的状态处理机处理,如果无法识别则报出错误,返回值为ArrayList对象类型。

analyse()方法
analyse()方法,用来赋值,返回值为ArrayList对象类型。

fromFile()方法
fromFile()方法,作用为将源代码文件加载并且解析,返回值为ArrayList对象类型。

(3)LexicalException类
LexicalException类为继承的Exception类,用来提示出现错误的字符,包含1个属性和3个方法。
Msg属性
Msg属性是String类型的用来存放出现错误时输出的信息。

LexicalException(char c)方法
LexicalException(char c)方法,用来接收char类型的错误输入,将错误的字符串转化为String类型并且存到mag属性中。

LexicalException(String _msg)方法
LexicalException(String _msg)方法,用来接收String类型的错误输入,直接将错误的 字符串存到msg中。

getMessage()方法
getMessage()方法用来返回现在msg中存储的信息。

(4)Token类
Token类作用为定义各种转态机的处理流程,包括2个属性和15个方法。

_type属性
_type属性为枚举类型的常量,用来存储文法类型。

_value属性
_value属性为String类型,用来存储判断的字符串。

Token()方法
Token()方法作用为获取参数并且给属性赋值。

getType()
getType()方法作用为返回词法处理后语句的类型,返回值为枚举类型。

getValue()
getValue()方法作用为返回词法处理后语句的内容,返回值为String类型。

toString()
toString()方法作用为将属性编译成String类型并且返回,返回值为String类型。

isVariable()
isVariable()方法作用为判断当前类型是否为变量,返回值为boolean类型。

isScalar()
isScalar()方法作用为判断当前类型是否为整形、字符串、浮点数、布尔型,返回值为boolean类型。

makeVarOrKeyword()方法
makeVarOrKeyword()方法作用为获得的单词并且进行初步分类,判断单词的类型是否为变量、为关键字或者为布尔值,返回值为Token对象类型。

makeString()方法
makeString()方法为处理字符串的状态机,当单词为字符串类型时,通过该方法处理,返回值为Token对象类型。

makeOp()方法
makeOp()方法为运算符处理机,当识别的单词为运算符类型时运用该方法进行处理,返回值为Token类型。

makeNumber()方法
makeNumber()方法为数字转态机,当识别单词为整形时运用该方法进行处理,返回值为Token类型。

isNumber()方法
isNumber()方法作用为判断当前的类型是否为整形或者为浮点数类型,返回值为boolean类型。

isOperator()方法
isOperator()方法作用为判断当前类型是否为运算符类型,返回值为boolean类型。

isPostUnaryOperator()方法
isPostUnaryOperator()方法作用为判断当前_value属性中存储的字符否为’++’或者’–’,返回值为boolean类型。

isType()方法
isType()方法作用为判断当前_value属性中存储的字符否为’bool’、’int’、’float’、’void’、’string’,返回值为boolean类型。

isValue()方法
isValue()方法作用为判断当前读取的单词是关键字还是为变量,返回值为boolean类型。

(5)TokenType类
TokenType类为枚举类型用来存储常量,包含8个常量,分别为KEYWORD关键字,VARIABLE变量,OPERATOR运算符,BRACKET括号,INTEGER整形,STRING字符串,FLOAT浮点数,BOOLEAN布尔型。

四、测试执行过程分析

词法分析器的测试代码位于src/test/java目录下,包括commom和lexer两个包,分别分析如下。
词法分析器包括commom和lexer两个包,分别分析如下。

1.common包

common包内的类分析如下。
(1)AlphabetHelperTests类
AlphabetHelperTests类的主要作用是对AlphabetHelper类的4个方法进行测试,通过test()方法验证其能否正确区分是否为相应类型的字符。
在这里插入图片描述

经测试,AlphabetHelper类的4个方法实现了相应功能。
(2)PeekIteratorTests类
PeekIteratorTests类的主要作用是对PeekIterator类的7个方法进行测试,通过test()方法验证其是否能正确的对单词进行操作。
在这里插入图片描述

经测试,PeekIterator类的7个方法实现了相应功能。

2.lexer包

lexer包内的类分析如下。
(1)LexerTests类
LexerTests类的主要作用为对Lexer类中的3个方法进行测试,通过test()方法验证其是否能正确的对单词进行词法分析。
在这里插入图片描述

经测试,Lexer类中的3个方法实现了相应功能。
(2)TokenTests类
TokenTests类的主要作用为对Token类中的15个方法进行测试,通过test()方法验证其是否能正确的调用相应的状态机对单词进行操作。
在这里插入图片描述

经测试,Token类中的15个方法实现了相应功能。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值