论是FROM,还是from,亦或FrOm,均可以被正确识别。
测试结果如下图所示:
2. 例程2
(1)测试例程设计
但是在实际中,笔者发现有时文本文档不能正确地检查到.txt文件的结尾标志。故设计如下用例。且在该用例中,笔者自行设计了出错记号ERRTOKEN。 (2)测试结果
test2.txt文件内容如下: lsfjlaks;
origin is (100, 300); --here are notes rot is 0; throw is
测试结果如下图所示:
四、总结、体会及其他
整体来说这次用Java来实现词法分析器对我来说确实存在这不小的挑战,而且我写的程序还或多或少的存在着这样或那样的瑕疵,但我收获了许多。而这收获既包括技术方面的,也包括非技术层面的。现将我的收获列举如下:
1. 现在突然开始明白为什么强人能够在很短的时间内学会一种语言,并能够灵活
运用。那是因为他们目标明确。然后只看跟自己有关的部分,有侧重点,而不是胡子眉毛一起抓。
2. 起初根本不知道Java到底怎么调试,可是等到会了之后,会发现其实和其他的
任何语言一样,用Java的printf,学会如何进行调试让我至少在心理上对Java不再那么的害怕。
3. “Java中没有指针” 这句话其实是骗人的,所谓的没有,只不过是换了个名
字而已。Java的指针一般都是用类进行包装的,而指针函数则是用java.lang.reflect进行实现的。
4. C中的将预读的字符退回到文件输入流中,回退函数ungetc,在Java中我们用
了java.io.PushbackReader来进行实现。由于平时Java中用到的关于输入输出流的函数一般是java.io.InputStream、java.io.OutputStream,以及java.io.File,而至于PushbackReader之类的退回函数则用的比较少了。学习它着实费了一番力气。
5. 还有对于某些.txt文件不能识别其结束标志,这个确实比较麻烦。 6. 词法分析中LineNo,即跟踪记号所在源文件行号,由于Java中并不识别unsigned
类型,故只得将其定义为int。
第二次上机题目:语法分析器的构造
一、任务与目的
1. 任务
语法分析是语法制导翻译的基础,语法分析器是函数绘图语言解释器的核心,因此语法分析器的构造是整个解释器构造的关键。
语法分析器的构造分为两个重要步骤:规定语言的文法和根据文法编写程序。由于我们采用递归下降子程序方法,因此在文法的设计上的要求是LL(1)文法。同时语法分析时要构造出语言结构的语法树,以便于后边的语法知道翻译。具体到此绘图语言,需要构造语法树的语言结构仅限于表达式,从而为语义做铺垫。
语法分析器的任务:
(1) 为句子构造语法树
(2) 检查输入序列中的错误 故主要的工作如下:
(1) 设计函数绘图语言的文法,使其适合递归下降分析 (2) 设计语法树的节点,用于存放表达式的语法树
(3) 设计递归下降子程序,分析句子并构造表达式的语法树 (4) 设计测试程序和测试用例,检验分析器是否正确
2. 目的
编写一个语法分析器,不限语言
二、软件设计
1. Java软件包的设计
由于涉及到语法分析器要调用词法分析器的内容,故现将Java中的包组织如下所示:
2. 适合编写递归下降子程序的文法
包含了左递归和公共左因子的文法G1如下所示: 其中$代表空。
--------------------------------------------------------------------------------------------------------------------------- Program -> Statement SEMICO | $
Statement -> OriginStatement | ScaleStatement | RotStatement | ForStatement OriginStatement
-> ORIGIN IS L_BRACKET Expression COMMA Expression R_BRACKET -> SCALE IS L_BRACKET Expression COMMA Expression R_BRACKET
ScaleStatement
RotStatement -> ROT IS Expression ForStatement
Expression -> Expression PLUS Term
| Expression MINUS Term | Term
-> FOR T FROM Expression TO Expression STEP Expression
DRAW L_BRACKET Expression COMMA Expression R_BRACKET
Term -> Term MUL Factor
| Term DIV Factor | Factor | MINUS Factor | Component | Atom | T
| FUNC L_BRACKET Expression R_BRACKET | L_BRACKET Expression R_BRACKET
Factor -> PLUS Factor
Component -> Atom POWER Component Atom -> CONST_ID
---------------------------------------------------------------------------------------------------------------------------
消除了左递归和公共左因子的文法G3如下所示: 其中$代表空。
--------------------------------------------------------------------------------------------------------------------------- Program -> Statement SEMICO | $
Statement -> OriginStatement | ScaleStatement | RotStatement | ForStatement OriginStatement
-> ORIGIN IS L_BRACKET Expression COMMA Expression R_BRACKET -> SCALE IS L_BRACKET Expression COMMA Expression R_BRACKET
ScaleStatement
RotStatement -> ROT IS Expression ForStatement
-> FOR T FROM Expression TO Expression STEP Expression
DRAW L_BRACKET Expression COMMA Expression R_BRACKET
Expression -> Term Expression’ Expression’ -> PLUS
Term -> Factor Term’ Term’ -> MUL Factor Term’
| T
| FUNC L_BRACKET Expression R_BRACKET | L_BRACKET Expression R_BRACKET
| DIV Factor Term’ | $
| MINUS Factor | Component | Atom
| Term Expression’ | MINUS Term Expression’ | $
Factor -> PLUS Factor
Component -> Atom POWER Component Atom -> CONST_ID
---------------------------------------------------------------------------------------------------------------------------
对Term进行了转换的文法G4如下所示:
--------------------------------------------------------------------------------------------------------------------------- Program -> { Statement SEMICO }
Statement -> OriginStatement | ScaleStatement | RotStatement | ForStatement OriginStatement
-> ORIGIN IS L_BRACKET Expression COMMA Expression R_BRACKET -> SCALE IS L_BRACKET Expression COMMA Expression R_BRACKET
ScaleStatement
RotStatement -> ROT IS Expression ForStatement
-> FOR T FROM Expression TO Expression STEP Expression
DRAW L_BRACKET Expression COMMA Expression R_BRACKET
Expression -> Term { ( PLUS | MINUS ) Term } Term -> Factor{ ( MUL | DIV ) Factor } Factor
| T
-> PLUS Factor | MINUS Factor | Component
-> Atom POWER Component | Atom
Component
Atom -> CONST_ID
| FUNC L_BRACKET Expression R_BRACKET