语法分析器的简单实现

一、实验目的

通过构建一个简单的语法分析程序,进一步熟悉语法分析的过程以及加深对 First 和Follow 的认识。

二、实验描述

本次实验使用 Java 语言编写,简单实现了对 C 语言程序的语法分析。程序的输入是 C 语言程序代码 program.c 文件以及已经定义好的文法 CFG.txt 文件。程序的输出是控制台和 output.txt 文件,内容是语法分析的过程。本实验中用到的词法分析部分是实验一的词法分析器。

三、实验方法

本次实验选用的方法是 PPT 中给出的第一种方法中的 a 方法,根据文法编程构建 LL(1) 预测分析表来进行语法分析。

实验设想

无。

相关的自动机描述

大部分同词法分析。

四、数据结构的定义

Lex 类:词法分析程序

Token 类:Token 序列中的元素

Production 类:产生式类,包括两个属性,一个是 left(String 类型),表示产生式的左部;另一个是 right(List类型),表示产生式的右部。
FirstFollow 类:表示 First 或 Follow 的类,包括两个属性,一个是 left(String 类型),另一个是 right(List类型)。
Syntax 类:语法分析程序核心 终结符和非终结符分别用 List类型来表示。

产生式用 List类型来表示。

符号的 First 和 Follow 分别用 List类型来表示。

预测分析表用 Production[][]类型表示,还需要借助终结符和非终结符的 List作为表头。

语法分析过程中的栈用 Java 自带的 Stack来表示。

Token 序列(简化版)用 List类型来表示。

五、核心算法描述

程序的核心算法主要有四个:

getFirst():获得符号的 First 集合,算法在龙书的 P140.

getFollow():获得符号的 Follow 集合,算法在龙书的 P140-141.

getParsingTable():构建预测分析表,算法在龙书的 P142-143,算法 4.31

syntaxParsing():表驱动的预测语法分析,算法在龙书的 P144,算法 4.34

语法分析的过程输出 output.txt:

Match:  	 
Stack: 	 	$ Function  
Input: 	 	int ID ( float ID ) { while ( ID <= NUM ) { if ( ID == NUM ) { ID = NUM ; } else 
{ int ID = NUM ; ID = ID + NUM ; } } return NUM ; } $  
Action:  	输出: Program -> Function  
Match:  	 
Stack: 	 	$ } Return Statement { ) Para ( FuncName DataType  
Input: 	 	int ID ( float ID ) { while ( ID <= NUM ) { if ( ID == NUM ) { ID = NUM ; } else 
{ int ID = NUM ; ID = ID + NUM ; } } return NUM ; } $  
Action:  	输出: Function -> DataType FuncName ( Para ) { Statement Return }  
Match:  	 
Stack: 	 	$ } Return Statement { ) Para ( FuncName int  
Input: 	 	int ID ( float ID ) { while ( ID <= NUM ) { if ( ID == NUM ) { ID = NUM ; } else 
{ int ID = NUM ; ID = ID + NUM ; } } return NUM ; } $  
Action:  	输出: DataType -> int  
Match:  	int  
Stack: 	 	$ } Return Statement { ) Para ( FuncName  
Input: 	 	ID ( float ID ) { while ( ID <= NUM ) { if ( ID == NUM ) { ID = NUM ; } else { int 
ID = NUM ; ID = ID + NUM ; } } return NUM ; } $

Action: 匹配 int

Match:  	int  
Stack: 	 	$ } Return Statement { ) Para ( ID  
Input: 	 	ID ( float ID ) { while ( ID <= NUM ) { if ( ID == NUM ) { ID = NUM ; } else { int 
ID = NUM ; ID = ID + NUM ; } } return NUM ; } $  
Action:  	输出: FuncName -> ID  
Match:  	int ID  
Stack: 	 	$ } Return Statement { ) Para (  
Input: 	 	( float ID ) { while ( ID <= NUM ) { if ( ID == NUM ) { ID = NUM ; } else { int ID 
= NUM ; ID = ID + NUM ; } } return NUM ; } $

Action: 匹配 ID

Match: 	int ID (  
Stack: 	 	$ } Return Statement { ) Para  
Input: 	 	float ID ) { while ( ID <= NUM ) { if ( ID == NUM ) { ID = NUM ; } else { int ID = 
NUM ; ID = ID + NUM ; } } return NUM ; } $

Action: 匹配 (

Match:  	int ID (  
Stack: 	 	$ } Return Statement { ) ID DataType  
Input: 	 	float ID ) { while ( ID <= NUM ) { if ( ID == NUM ) { ID = NUM ; } else { int ID = 
NUM ; ID = ID + NUM ; } } return NUM ; } $  
Action:  	输出: Para -> DataType ID  
Match:  	int ID (  
Stack: 	 	$ } Return Statement { ) ID float  
Input: 	 	float ID ) { while ( ID <= NUM ) { if ( ID == NUM ) { ID = NUM ; } else { int ID = 
NUM ; ID = ID + NUM ; } } return NUM ; } $  
Action:  	输出: DataType -> float  
Match:  	int ID ( float  
Stack: 	 	$ } Return Statement { ) ID  
Input: 	 	ID ) { while ( ID <= NUM ) { if ( ID == NUM ) { ID = NUM ; } else { int ID = NUM ; 
ID = ID + NUM ; } } return NUM ; } $

Action: 匹配 float

Match:  	int ID ( float ID  
Stack: 	 	$ } Return Statement { )  
Input: 	 	) { while ( ID <= NUM ) { if ( ID == NUM ) { ID = NUM ; } else { int ID = NUM ; 
ID = ID + NUM ; } } return NUM ; } $

Action: 匹配 ID

Match:  	int ID ( float ID )  
Stack: 	 	$ } Return Statement {  
Input: 	 	{ while ( ID <= NUM ) { if ( ID == NUM ) { ID = NUM ; } else { int ID = NUM ; ID 
= ID + NUM ; } } return NUM ; } $

Action: 匹配 )

Match:  	int ID ( float ID ) {  
Stack: 	 	$ } Return Statement  
Input: 	 	while ( ID <= NUM ) { if ( ID == NUM ) { ID = NUM ; } else { int ID = NUM ; ID 
= ID + NUM ; } } return NUM ; } $

Action: 匹配 {

Match:  	int ID ( float ID ) {  
Stack: 	 	$ } Return Statement S  
Input: 	while ( ID <= NUM ) { if ( ID == NUM ) { ID = NUM ; } else { int ID = NUM ; ID 
= ID + NUM ; } } return NUM ; } $  
Action:  	输出: Statement -> S Statement  
Match:  	int ID ( float ID ) {  
Stack: 	 	$ } Return Statement B ) C ( while  
Input: 	 	while ( ID <= NUM ) { if ( ID == NUM ) { ID = NUM ; } else { int ID = NUM ; ID 
= ID + NUM ; } } return NUM ; } $  
Action:  	输出: S -> while ( C ) B  
Match:  	int ID ( float ID ) { while  
Stack: 	 	$ } Return Statement B ) C (  
Input: 	 	( ID <= NUM ) { if ( ID == NUM ) { ID = NUM ; } else { int ID = NUM ; ID = ID + 
NUM ; } } return NUM ; } $

Action: 匹配 while

Match:  	int ID ( float ID ) { while (  
Stack: 	 	$ } Return Statement B ) C  
Input: 	 	ID <= NUM ) { if ( ID == NUM ) { ID = NUM ; } else { int ID = NUM ; ID = ID + 
NUM ; } } return NUM ; } $

Action: 匹配 (

Match:  	int ID ( float ID ) { while (  
Stack: 	 	$ } Return Statement B ) Keyword CompareOP Keyword  
Input: 	 	ID <= NUM ) { if ( ID == NUM ) { ID = NUM ; } else { int ID = NUM ; ID = ID + 
NUM ; } } return NUM ; } $  
Action:  	输出: C -> Keyword CompareOP Keyword  
Match:  	int ID ( float ID ) { while (  
Stack: 	 	$ } Return Statement B ) Keyword CompareOP ID  
Input: 	 	ID <= NUM ) { if ( ID == NUM ) { ID = NUM ; } else { int ID = NUM ; ID = ID + 
NUM ; } } return NUM ; } $  
Action:  	输出: Keyword -> ID  
Match:  	int ID ( float ID ) { while ( ID  
Stack: 	 	$ } Return Statement B ) Keyword CompareOP  
Input: 	 	<= NUM ) { if ( ID == NUM ) { ID = NUM ; } else { int ID = NUM ; ID = ID + 
NUM ; } } return NUM ; } $

Action: 匹配 ID

Match:

int ID ( float ID ) { while ( ID

Stack:

$ } Return Statement B ) Keyword <=

Input:

<= NUM ) { if ( ID == NUM ) { ID = NUM ; } else { int ID = NUM ; ID = ID +

NUM ; } } return NUM ; } $  
Action: 	输出: CompareOP -> <=  
Match:  	int ID ( float ID ) { while ( ID <=  
Stack: 	 	$ } Return Statement B ) Keyword  
Input:  NUM ) { if ( ID == NUM ) { ID = NUM ; } else { int ID = NUM ; ID = ID + NUM ; } } return NUM ; } $

Action: 匹配 <=

Match:  	int ID ( float ID ) { while ( ID <=  
Stack: 	 	$ } Return Statement B ) NUM  
Input:  NUM ) { if ( ID == NUM ) { ID = NUM ; } else { int ID = NUM ; ID = ID + NUM ; } } return NUM ; } $  
Action:  	输出: Keyword -> NUM  
Match:  	int ID ( float ID ) { while ( ID <= NUM  
Stack: 	 	$ } Return Statement B )  
Input:  ) { if ( ID == NUM ) { ID = NUM ; } else { int ID = NUM ; ID = ID + NUM ; } } return NUM ; } $

Action: 匹配 NUM

Match:  	int ID ( float ID ) { while ( ID <= NUM )  
Stack: 	 	$ } Return Statement B  
Input:  { if ( ID == NUM ) { ID = NUM ; } else { int ID = NUM ; ID = ID + NUM ; } } return NUM ; } $

Action: 匹配 )

Match:  	int ID ( float ID ) { while ( ID <= NUM )  
Stack: 	 	$ } Return Statement } Statement {  
Input:  { if ( ID == NUM ) { ID = NUM ; } else { int ID = NUM ; ID = ID + NUM ; } } return NUM ; } $  
Action:  	输出: B -> { Statement }  
Match:  	int ID ( float ID ) { while ( ID <= NUM ) {  
Stack: 	 	$ } Return Statement } Statement  
Input: 	 	if ( ID == NUM ) { ID = NUM ; } else { int ID = NUM ; ID = ID + NUM ; } } return NUM ; } $

Action: 匹配 {

Match:  	int ID ( float ID ) { while ( ID <= NUM ) {

Stack:

$ } Return Statement } Statement S

Input: ;NUM ; } $

if ( ID == NUM ) { ID = NUM ; } else { int ID = NUM ; ID = ID + NUM ; } } return

Action:

输出: Statement -> S Statement

Match:

int ID ( float ID ) { while ( ID <= NUM ) {

Stack:

$ } Return Statement } Statement D B ) C ( if

Input:

if ( ID == NUM ) { ID = NUM ; } else { int ID = NUM ; ID = ID + NUM ; } } return

NUM ; } $ Action: ;

输出: S -> if ( C ) B D

Match:

int ID ( float ID ) { while ( ID <= NUM ) { if

Stack:

$ } Return Statement } Statement D B ) C (

Input:

( ID == NUM ) { ID = NUM ; } else { int ID = NUM ; ID = ID + NUM ; } } return

NUM ; } $ Action: ;

匹配 if

Match:

int ID ( float ID ) { while ( ID <= NUM ) { if (

Stack:

$ } Return Statement } Statement D B ) C

Input:

ID == NUM ) { ID = NUM ; } else { int ID = NUM ; ID = ID + NUM ; } } return

NUM ; } $ Action: ;

匹配 (

Match:

int ID ( float ID ) { while ( ID <= NUM ) { if (

Stack:

$ } Return Statement } Statement D B ) Keyword CompareOP Keyword

Input:

ID == NUM ) { ID = NUM ; } else { int ID = NUM ; ID = ID + NUM ; } } return

NUM ; } $ Action: ;

输出: C -> Keyword CompareOP Keyword

Match:

int ID ( float ID ) { while ( ID <= NUM ) { if (

Stack:

$ } Return Statement } Statement D B ) Keyword CompareOP ID

Input:

ID == NUM ) { ID = NUM ; } else { int ID = NUM ; ID = ID + NUM ; } } return

NUM ; } $ Action: ;

输出: Keyword -> ID

Match:

int ID ( float ID ) { while ( ID <= NUM ) { if ( ID

Stack:

$ } Return Statement } Statement D B ) Keyword CompareOP

Input:

== NUM ) { ID = NUM ; } else { int ID = NUM ; ID = ID + NUM ; } } return NUM ; }

$ ;Action: ;

匹配 ID

Match:

int ID ( float ID ) { while ( ID <= NUM ) { if ( ID

Stack:

$ } Return Statement } Statement D B ) Keyword ==

Input:

== NUM ) { ID = NUM ; } else { int ID = NUM ; ID = ID + NUM ; } } return NUM ; }

$ ;Action: ;

输出: CompareOP -> ==

Match:

int ID ( float ID ) { while ( ID <= NUM ) { if ( ID ==

Stack:

$ } Return Statement } Statement D B ) Keyword

Input:

NUM ) { ID = NUM ; } else { int ID = NUM ; ID = ID + NUM ; } } return NUM ; }

$ Action: ;

匹配 ==

Match:

int ID ( float ID ) { while ( ID <= NUM ) { if ( ID ==

Stack:

$ } Return Statement } Statement D B ) NUM

Input:

NUM ) { ID = NUM ; } else { int ID = NUM ; ID = ID + NUM ; } } return NUM ; }

$ ;Action:

输出: Keyword -> NUM

;Match:

int ID ( float ID ) { while ( ID <= NUM ) { if ( ID == NUM

Stack:

$ } Return Statement } Statement D B )

Input:

) { ID = NUM ; } else { int ID = NUM ; ID = ID + NUM ; } } return NUM ; } $

Action: ;

匹配 NUM

Match:

int ID ( float ID ) { while ( ID <= NUM ) { if ( ID == NUM )

Stack:

$ } Return Statement } Statement D B

Input:

{ ID = NUM ; } else { int ID = NUM ; ID = ID + NUM ; } } return NUM ; } $

Action: ;

匹配 )

Match:

int ID ( float ID ) { while ( ID <= NUM ) { if ( ID == NUM )

Stack:

$ } Return Statement } Statement D } Statement {

Input:

{ ID = NUM ; } else { int ID = NUM ; ID = ID + NUM ; } } return NUM ; } $

Action:

输出: B -> { Statement }

;Match:

int ID ( float ID ) { while ( ID <= NUM ) { if ( ID == NUM ) {

Stack:

$ } Return Statement } Statement D } Statement

Input:

ID = NUM ; } else { int ID = NUM ; ID = ID + NUM ; } } return NUM ; } $

Action: ;

匹配 {

Match:

int ID ( float ID ) { while ( ID <= NUM ) { if ( ID == NUM ) {

Stack:

$ } Return Statement } Statement D } Statement S

Input:

ID = NUM ; } else { int ID = NUM ; ID = ID + NUM ; } } return NUM ; } $

Action:

输出: Statement -> S Statement

;Match:

int ID ( float ID ) { while ( ID <= NUM ) { if ( ID == NUM ) {

Stack:

$ } Return Statement } Statement D } Statement N Keyword = ID

Input:

ID = NUM ; } else { int ID = NUM ; ID = ID + NUM ; } } return NUM ; } $

Action: ;

输出: S -> ID = Keyword N

Match:

int ID ( float ID ) { while ( ID <= NUM ) { if ( ID == NUM ) { ID

Stack:

$ } Return Statement } Statement D } Statement N Keyword =

Input:

= NUM ; } else { int ID = NUM ; ID = ID + NUM ; } } return NUM ; } $

Action:

匹配 ID

;Match:

int ID ( float ID ) { while ( ID <= NUM ) { if ( ID == NUM ) { ID =

Stack:

$ } Return Statement } Statement D } Statement N Keyword

Input:

NUM ; } else { int ID = NUM ; ID = ID + NUM ; } } return NUM ; } $

Action: ;

匹配 =

Match:

int ID ( float ID ) { while ( ID <= NUM ) { if ( ID == NUM ) { ID =

Stack:

$ } Return Statement } Statement D } Statement N NUM

Input:

NUM ; } else { int ID = NUM ; ID = ID + NUM ; } } return NUM ; } $

Action:

输出: Keyword -> NUM

;Match:

int ID ( float ID ) { while ( ID <= NUM ) { if ( ID == NUM ) { ID = NUM

Stack:

$ } Return Statement } Statement D } Statement N

Input:

; } else { int ID = NUM ; ID = ID + NUM ; } } return NUM ; } $

Action:

匹配 NUM

;Match:

int ID ( float ID ) { while ( ID <= NUM ) { if ( ID == NUM ) { ID = NUM

Stack:

$ } Return Statement } Statement D } Statement ;

Input:

; } else { int ID = NUM ; ID = ID + NUM ; } } return NUM ; } $

Action: ;

输出: N -> ;

Match:

int ID ( float ID ) { while ( ID <= NUM ) { if ( ID == NUM ) { ID = NUM ;

Stack:

$ } Return Statement } Statement D } Statement

Input:

} else { int ID = NUM ; ID = ID + NUM ; } } return NUM ; } $

Action: ;

匹配 ;

Match:

int ID ( float ID ) { while ( ID <= NUM ) { if ( ID == NUM ) { ID = NUM ;

Stack:

$ } Return Statement } Statement D }

Input:

} else { int ID = NUM ; ID = ID + NUM ; } } return NUM ; } $

Action: ;

输出: Statement -> ε

Match:

int ID ( float ID ) { while ( ID <= NUM ) { if ( ID == NUM ) { ID = NUM ; }

Stack:

$ } Return Statement } Statement D

Input:

else { int ID = NUM ; ID = ID + NUM ; } } return NUM ; } $

Action: ;

匹配 }

Match:

int ID ( float ID ) { while ( ID <= NUM ) { if ( ID == NUM ) { ID = NUM ; }

Stack:

$ } Return Statement } Statement B else

Input:

else { int ID = NUM ; ID = ID + NUM ; } } return NUM ; } $

Action:

输出: D -> else B

;Match:

int ID ( float ID ) { while ( ID <= NUM ) { if ( ID == NUM ) { ID = NUM ; } else

Stack:

$ } Return Statement } Statement B

Input:

{ int ID = NUM ; ID = ID + NUM ; } } return NUM ; } $

Action: ;

匹配 else

Match:

int ID ( float ID ) { while ( ID <= NUM ) { if ( ID == NUM ) { ID = NUM ; } else

Stack:

$ } Return Statement } Statement } Statement {

Input:

{ int ID = NUM ; ID = ID + NUM ; } } return NUM ; } $

Action: ;

输出: B -> { Statement }

Match:

int ID ( float ID ) { while ( ID <= NUM ) { if ( ID == NUM ) { ID = NUM ; } else {

Stack:

$ } Return Statement } Statement } Statement

Input:

int ID = NUM ; ID = ID + NUM ; } } return NUM ; } $

Action: ;

匹配 {

Match:

int ID ( float ID ) { while ( ID <= NUM ) { if ( ID == NUM ) { ID = NUM ; } else {

Stack:

$ } Return Statement } Statement } Statement S

Input:

int ID = NUM ; ID = ID + NUM ; } } return NUM ; } $

Action:

输出: Statement -> S Statement

;Match:

int ID ( float ID ) { while ( ID <= NUM ) { if ( ID == NUM ) { ID = NUM ; } else {

Stack:

$ } Return Statement } Statement } Statement M ID DataType

Input:

int ID = NUM ; ID = ID + NUM ; } } return NUM ; } $

Action:

输出: S -> DataType ID M

;Match:

int ID ( float ID ) { while ( ID <= NUM ) { if ( ID == NUM ) { ID = NUM ; } else {

Stack:

$ } Return Statement } Statement } Statement M ID int

Input:

int ID = NUM ; ID = ID + NUM ; } } return NUM ; } $

Action: ;

输出: DataType -> int

Match:

int ID ( float ID ) { while ( ID <= NUM ) { if ( ID == NUM ) { ID = NUM ; } else

{ int ; Stack:

$ } Return Statement } Statement } Statement M ID

Input:

ID = NUM ; ID = ID + NUM ; } } return NUM ; } $

Action:

匹配 int

;Match:

int ID ( float ID ) { while ( ID <= NUM ) { if ( ID == NUM ) { ID = NUM ; } else

{ int ID ; Stack:

$ } Return Statement } Statement } Statement M

Input:

= NUM ; ID = ID + NUM ; } } return NUM ; } $

Action:

匹配 ID

;Match:

int ID ( float ID ) { while ( ID <= NUM ) { if ( ID == NUM ) { ID = NUM ; } else

{ int ID ; Stack:

$ } Return Statement } Statement } Statement ; NUM =

Input:

= NUM ; ID = ID + NUM ; } } return NUM ; } $

Action:

输出: M -> = NUM ;

Match:  int ID ( float ID ) { while ( ID <= NUM ) { if ( ID == NUM ) { ID = NUM ; } else { int ID =  
	Stack: 	 	$ } Return Statement } Statement } Statement ; NUM  
	Input: 	 	NUM ; ID = ID + NUM ; } } return NUM ; } $  
	Action:  	匹配 = 
 
Match:  int ID ( float ID ) { while ( ID <= NUM ) { if ( ID == NUM ) { ID = NUM ; } else { int ID = NUM  
	Stack: 	 	$ } Return Statement } Statement } Statement ;  
	Input: 	 	; ID = ID + NUM ; } } return NUM ; } $  
	Action:  	匹配 NUM 
 
Match:  int ID ( float ID ) { while ( ID <= NUM ) { if ( ID == NUM ) { ID = NUM ; } else { int ID = NUM ;  
	Stack: 	 	$ } Return Statement } Statement } Statement  
	Input: 	 	ID = ID + NUM ; } } return NUM ; } $  
	Action:  	匹配 ; 
 
Match:  int ID ( float ID ) { while ( ID <= NUM ) { if ( ID == NUM ) { ID = NUM ; } else { int ID = NUM ;  
	Stack: 	 	$ } Return Statement } Statement } Statement S  
	Input: 	 	ID = ID + NUM ; } } return NUM ; } $  
	Action:  	输出: Statement -> S Statement  
 
Match:  int ID ( float ID ) { while ( ID <= NUM ) { if ( ID == NUM ) { ID = NUM ; } else { int ID = NUM ;  
	Stack: 	 	$ } Return Statement } Statement } Statement N Keyword = ID  
	Input: 	 	ID = ID + NUM ; } } return NUM ; } $  
	Action:  	输出: S -> ID = Keyword N  
 
Match:  int ID ( float ID ) { while ( ID <= NUM ) { if ( ID == NUM ) { ID = NUM ; } else { int ID = NUM ; ID  
	Stack: 	 	$ } Return Statement } Statement } Statement N Keyword =  
	Input: 	 	= ID + NUM ; } } return NUM ; } $  
	Action:  	匹配 ID 
 
Match:  int ID ( float ID ) { while ( ID <= NUM ) { if ( ID == NUM ) { ID = NUM ; } else { int ID = NUM ; ID =  
	Stack: 	 	$ } Return Statement } Statement } Statement N Keyword  
	Input: 	 	ID + NUM ; } } return NUM ; } $  
	Action:  	匹配 = 
 
	Match:  	int ID ( float ID ) { while ( ID <= NUM ) { if ( ID == NUM ) { ID = NUM ; } else
{ int ID = NUM ; ID =  
	Stack: 	 	$ } Return Statement } Statement } Statement N ID  
	Input: 	 	ID + NUM ; } } return NUM ; } $  
	Action:  	输出: Keyword -> ID  
 
Match:  int ID ( float ID ) { while ( ID <= NUM ) { if ( ID == NUM ) { ID = NUM ; } else { int ID = NUM ; ID = ID  
	Stack: 	 	$ } Return Statement } Statement } Statement N  
	Input: 	 	+ NUM ; } } return NUM ; } $  
	Action:  	匹配 ID 
 
Match:  int ID ( float ID ) { while ( ID <= NUM ) { if ( ID == NUM ) { ID = NUM ; } else { int ID = NUM ; ID = ID  
	Stack: 	 	$ } Return Statement } Statement } Statement ; Keyword OP  
	Input: 	 	+ NUM ; } } return NUM ; } $  
	Action:  	输出: N -> OP Keyword ;  
 
Match:  int ID ( float ID ) { while ( ID <= NUM ) { if ( ID == NUM ) { ID = NUM ; } else { int ID = NUM ; ID = ID  
	Stack: 	 	$ } Return Statement } Statement } Statement ; Keyword +  
	Input: 	 	+ NUM ; } } return NUM ; } $  
	Action:  	输出: OP -> +  
 
Match:  int ID ( float ID ) { while ( ID <= NUM ) { if ( ID == NUM ) { ID = NUM ; } else { int ID = NUM ; ID = ID +  
	Stack: 	 	$ } Return Statement } Statement } Statement ; Keyword  
	Input: 	 	NUM ; } } return NUM ; } $  
	Action:  	匹配 + 
 
Match:  int ID ( float ID ) { while ( ID <= NUM ) { if ( ID == NUM ) { ID = NUM ; } else { int ID = NUM ; ID = ID +  
	Stack: 	 	$ } Return Statement } Statement } Statement ; NUM  
	Input: 	 	NUM ; } } return NUM ; } $  
	Action:  	输出: Keyword -> NUM  
 
Match:  int ID ( float ID ) { while ( ID <= NUM ) { if ( ID == NUM ) { ID = NUM ; } else { int ID = NUM ; ID = ID + NUM  
	Stack: 	 	$ } Return Statement } Statement } Statement ;  
	Input: 	 	; } } return NUM ; } $  
	Action:  	匹配 NUM 
 
Match:  int ID ( float ID ) { while ( ID <= NUM ) { if ( ID == NUM ) { ID = NUM ; } else { int ID = NUM ; ID = ID + NUM ;  
	Stack: 	 	$ } Return Statement } Statement } Statement
Input: 	 	} } return NUM ; } $  
	Action:  	匹配 ; 
 
Match:  int ID ( float ID ) { while ( ID <= NUM ) { if ( ID == NUM ) { ID = NUM ; } else { int ID = NUM ; ID = ID + NUM ;  
	Stack: 	 	$ } Return Statement } Statement }  
	Input: 	 	} } return NUM ; } $  
	Action:  	输出: Statement -> ε  
 
Match:  int ID ( float ID ) { while ( ID <= NUM ) { if ( ID == NUM ) { ID = NUM ; } else { int ID = NUM ; ID = ID + NUM ; }  
	Stack: 	 	$ } Return Statement } Statement  
	Input: 	 	} return NUM ; } $  
	Action:  	匹配 } 
 
	Match:  	int ID ( float ID ) { while ( ID <= NUM ) { if ( ID == NUM ) { ID = NUM ; } else 
{ int ID = NUM ; ID = ID + NUM ; }  
	Stack: 	 	$ } Return Statement }  
	Input: 	 	} return NUM ; } $  
	Action:  	输出: Statement -> ε  
 
Match:  int ID ( float ID ) { while ( ID <= NUM ) { if ( ID == NUM ) { ID = NUM ; } else { int ID = NUM ; ID = ID + NUM ; } }  
	Stack: 	 	$ } Return Statement  
	Input: 	 	return NUM ; } $  
	Action:  	匹配 } 
 
Match:  int ID ( float ID ) { while ( ID <= NUM ) { if ( ID == NUM ) { ID = NUM ; } else { int ID = NUM ; ID = ID + NUM ; } }  
	Stack: 	 	$ } Return  
	Input: 	 	return NUM ; } $  
	Action:  	输出: Statement -> ε  
 
	Match:  	int ID ( float ID ) { while ( ID <= NUM ) { if ( ID == NUM ) { ID = NUM ; } else 
{ int ID = NUM ; ID = ID + NUM ; } }  
	Stack: 	 	$ } ; Keyword return  
	Input: 	 	return NUM ; } $  
	Action:  	输出: Return -> return Keyword ;  
 
Match:  int ID ( float ID ) { while ( ID <= NUM ) { if ( ID == NUM ) { ID = NUM ; } else { int ID = NUM ; ID = ID + NUM ; } } return  
	Stack: 	 	$ } ; Keyword  
	Input: 	 	NUM ; } $  
	Action:  	匹配 return
Match:  	int ID ( float ID ) { while ( ID <= NUM ) { if ( ID == NUM ) { ID = NUM ; } else 
{ int ID = NUM ; ID = ID + NUM ; } } return  
Stack: 	 	$ } ; NUM  
Input: 	 	NUM ; } $  
Action:  	输出: Keyword -> NUM  
Match:  	int ID ( float ID ) { while ( ID <= NUM ) { if ( ID == NUM ) { ID = NUM ; } else 
{ int ID = NUM ; ID = ID + NUM ; } } return NUM  
Stack: 	 	$ } ;  
Input: 	 	; } $

Action: 匹配 NUM

Match:  	int ID ( float ID ) { while ( ID <= NUM ) { if ( ID == NUM ) { ID = NUM ; } else 
{ int ID = NUM ; ID = ID + NUM ; } } return NUM ;  
Stack: 	 	$ }  
Input: 	 	} $  
Action:  	匹配 ; 
Match:  int ID ( float ID ) { while ( ID <= NUM ) { if ( ID == NUM ) { ID = NUM ; } else { int ID = NUM ; ID = ID + NUM ; } } return NUM ; }  
Stack: 	 	$  
Input: 	 	$

Action: 匹配 }

Match:  int ID ( float ID ) { while ( ID <= NUM ) { if ( ID == NUM ) { ID = NUM ; } else { int ID = NUM ; ID = ID + NUM ; } } return NUM ; } $  
Stack: 	 	 
Input:

Action: 匹配 $