miniJava词法分析器

一.miniJava介绍

miniJava是Java语言的一个子集,其支持类,有限的继承,简单数据类型和一些控制结构。

二.目的

设计并实现一个包含预处理功能的词法分析程序,加深对编译中词法分析过程的理解。

三.实验步骤

(1)预处理

实现一个预处理程序,其可以打开一个包含源程序的文本文件(比如txt格式),并把对源程序没有意义的符号去掉。

首先编制一个源程序的输入过程,从键盘、文件或文本框输入若干行语句,依次存入输入缓冲区(字符型数据);然后编制一个预处理子程序,去掉输入串中的回车符、换行符和跳格符等编辑性文字;把多个空白符合并为一个;去掉注释。

(2)输入与输出

输入:所给文法的源程序字符串。 
输出:二元组(syn,token)构成的序列。其中, 
syn为单词种别码。 
Token为存放的单词自身字符串(如果是整型或浮点数,也用字符串储存)。

(3)词法

关键字:

boolean class else extends false if int length main new public return static this true void while String System.out.println

运算符和界符:

operator = ’=’|’+’|’-’|’*’|’/’|"&&"|"||"|’!’|"=="|"!="|’<’|"<="|’>’|">="
delimiter = ’;’|’,’|’.’|’(’|’)’|’[’|’]’|’{’|’}’

标识符:

与Java标识符规则相同,应以字母、下划线、美元符开头,后跟字母、下划线、美元符或数字 ,Java标识符大小写敏感,长度无限制。不能与关键字相同。

字符串:

要表示的字符串应该在双引号" "之间,字符串的每一个元素应该都是ASCII码表中的内容,但不包括双引号"(这里考不考虑引进转义符?)

注释:

注释与Java要求相同,有两种形式一种是//之后是注释,换行代表结束,一种是在/* */之间的为注释。

整型和浮点型要求与Java要求相同

(4) 码表

单词符号种别码单词符号种别码
boolean1==30
class2!=31
else3<32
extends4<=33
false5>34
if6>=35
int7;36
length8,37
main9.38
new10(39
public11)40
return12[41
static

13

]42
this14{43
true15

}

44
void16字符串45
while17整数46
String18浮点数47
println19  
double20  
int21  
=22  
+23  
-24  
*25  
/26  
&&27  
||28  
!29  

(5)正规式

letter: a | b | c | d | e | … | z | A | B | C | D | E | … | Z

digit: 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9

identifier: ( letter | _ | $ ) ( letter | digit | _ | $ )*

integer: ( 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 ) digit*

double: ( 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 ) digit*  . digit* ( 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 )

​ | 0 . digit* ( 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 )

(6) 文法分析

Program -> ClassDecl {ClassDecl}

ClassDecl -> "class" <ID> ["extends" <ID>] ’{’ {VarDecl} {MethodDecl} ’}’ 

MethodDecl -> "public" Type <ID> ’(’ [Formals] ’)’ ’{’ {VarDecl} {Statement} ’}’ 

                         | "public" "void" <ID> ’(’ [Formals] ’)’ ’{’ {VarDecl} {Statement} ’}’ 

                         | "public" "static" "void" "main" ’(’ "String" ’[’ ’]’ <ID> ’)’ ’{’ {VarDecl} {Statement} ’}’ 

Formals -> Type <ID> {’,’ Type <ID>}

VarDecl -> Type <ID> [’=’ FullExpr] ’;’ 

Type -> ElmType [’[’ ’]’]

ElmType -> "boolean" | "int" | <ID>

Statement -> ’{’ {Statement} ’}’ 

      | Lvalue = FullExpr ; | Lvalue ( [Params] ) ; 

      | "if" ( Expr ) Statement ["else" Statement]

      | "while" ( Expr ) Statement

      | "System.out.println" ( [PrintArg] ) ; 

      | "return" [Expr] ; 

Params -> Expr {’,’ Expr}

PrintArg -> Expr | <STR>

FullExpr -> "new" ElmType ’[’ <INT> ’]’ 

 | "new" <ID> ( [Params] )

 | Expr

Expr -> Expr Binop Expr | Unop Expr | ’(’ Expr ’)’ | Lvalue ’(’ [Params] ’)’ | Lvalue ’.’ "length" ’(’ ’)’ | Lvalue | Literal

Lvalue -> [ "this" . ] <ID> {Deref}

Deref -> [ Expr ] | . <ID> Literal -> <INT> | "true" | "false"

Binop -> + |- |* |/ |"&&" |"||" |"==" |"!=" |< |"<=" |> |">="

Unop -> - | ! 

参考:

C语言源程序词法分析器(Java实现)

miniJava

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值