编译原理——Java实现简单的词法分析器

Java实现简单的词法分析器

1.实验目的

  • 掌握词法分析器的功能。
  • 掌握词法分析器的实现。

2.文法介绍

<程序>→PROGRAM <标识符>;<分程序>.
<分程序>→<变量说明>BEGIN<语句表>END
<变量说明>→VAR<变量表>:<类型>;| <空>
<变量表>→<变量表>,<变量> | <变量>
<类型>→INTEGER
<语句表>→<语句表>;<语句> | <语句>
<语句>→<赋值语句> | <条件语句> | <WHILE语句> | <复合语句> | <过程定义>
<赋值语句>→<变量>:=<算术表达式>
<条件语句>→IF<关系表达式>THEN<语句>ELSE<语句>
<WHILE语句>→WHILE<关系表达式>DO<语句>
<复合语句>→BEGIN<语句表>END
<过程定义>→PROCEDURE<标识符><参数表>;
BEGIN<语句表>END
<参数表>→(<标识符表>)| <空>
<标识符表>→<标识符表>,<标识符> | <标识符>
<算术表达式>→<算术表达式>+<项> | <项>
<项>→<项>*<初等量> | <初等量>
<初等量>→(<算术表达式>)| <变量> | <无符号数>
<关系表达式>→<算术表达式><关系符><算术表达式>
<变量>→<标识符>
<标识符>→<标识符><字母> | <标识符><数学> | <字母>
<无符号数>→<无符号数><数字> | <数字>
<关系符>→= | < | <= | > | >= | <>
<字母>→A | B | C | ··· | X | Y | Z
<数字>→0 | 1 | 2 | ··· | 8 | 9
<空>→ε
要求和提示:
(1) 单词的分类。
可将所有标识符归为一类;将常数归为另一类;保留字和分隔符则采取一词一类。
(2) 符号表的建立。
可事先建立一保留字表,以备在识别保留字时进行查询。变量名表及常数表则在词法分析过程中建立。
(3) 单词串的输出形式。
所输出的每一单词,均按形如(CLASS,VALUE)的二元式编码。对于变量标识符和常数,CLASS字段为相应的类别码,VALUE字段则是该标识符、常数在其符号表中登记项的序号(要求在变量名表登记项中存放该标识符的字符串,其最大长度为四个字符;常数表登记项中则存放该整数的二进制形式。)。对于保留字和分隔号,由于采用一词一类的编码方式,所以仅需在二元式的CLASS字段上放置相应的单词的类别码,VALUE字段则为“空”。不过,为便于查看由词法分析程序所输出的单词串,也可以在CLASS字段上直接放置单词符号串本身。

3.关键字表

关键字:
“auto”, “break”, “case”, “char”, “const”, “continue”,
“default”, “do”, “double”, “else”, “enum”, “extern”,
“float”, “for”, “goto”, “if”, “int”, “long”,
“register”, “return”, “short”, “signed”, “sizeof”, “static”,
“struct”, “switch”, “typedef”, “union”, “unsigned”, “void”,
“volatile”, “while”
算术运算符表:
“+”, “-”, “*”, “/”
逻辑运算符表:
“<”, “<=”, “>”, “>=”, “=”, “==”,"<>"
界符表:
‘;’, ‘(’, ‘)’, ‘^’, ‘,’, ‘#’, ‘%’, ‘[’, ‘]’, ‘{’, ‘}’, ‘.’

4.运行结果

  • 待分析文件
    编译原理——Java实现简单的词法分析器
  • 运行结果
    编译原理——Java实现简单的词法分析器
    编译原理——Java实现简单的词法分析器
    编译原理——Java实现简单的词法分析器

5.源代码

https://github.com/Madrid-7/Java_test/tree/master/%E8%AF%8D%E6%B3%95%E5%88%86%E6%9E%90%E5%99%A8