https://download.csdn.net/download/qinglingls/11167561 该下载有bug’(修复版本和代码在下面链接)
代码下载网址:
附有报告和修复了bug的版本
https://download.csdn.net/download/qinglingls/11183444
input.txt
是输入的测试文件。
produce.txt
是输入的LR1产生式,能力不大,能if,while,赋值,加,乘,不能处理任何嵌套,没有数组,(这个你可以自己加文法进去进行处理)
Grammar.txt
是某个博客上的文法,看着很靠谱,但是我没有再做测试的心思了。。。
这个程序没啥bug,但是文法如果有左递归,那肯定是会出现stack overflow的(书上算法就是这么设计的)
另外LR文法不能有二义性,你得在文法里面把算术优先级给解决了。
另外如果加入嵌套,那必然复杂度指数上升,得跑很久。。。。十分钟似乎都不算多。。
运行指南:
gui.JtableParse3.java 显示LR1分析表,同时对input里面的文件进行分析。输出词法分析结果到output.txt
输出规约过程,很小一段语句可能就会很长的规约过程。
letex.LexResult.java 显示词法分析结果。输出全部识别出来的单词。
LR1识别实现完全在Parse3包里,自己看名字去读代码。
几乎每一个主要的类我都写了main()方法,可以自己输入一些产生式去试下,
比如书上给的:
S’ -> S
S -> C C
C -> c C|d
得到的集合和LR1的结果和书上完全一致
和一些网址上的
S’ -> S
S -> L = R
S -> R
L -> * R
L -> id
R -> L
你可以通过跑ItemTable.java 得到全部的集合和goto集合,
通过跑gotoTable.java 得到goto表
通过跑ActionTable.java 得到action表(cmd形式)
通过跑parse.java 得到两张表的合集和规约过程。
gui.JtableParse3.java 把上面的两张表合在一起图形化了。
我鼓励你发现我的bug 0虽然我不一定会决定去修改它,
但你可以发布修复bug的最新版本。注意标明原转载网址奥。
更加详细的思路和其他的说明,见下面的网址:
https://blog.csdn.net/qinglingLS
和:
【HIT哈工大编译原理实验】词法分析程序java
【编译原理】求first集合的代码实现java
【编译原理】求GOTO图的代码实现java
【编译原理】LL(1)分析法代码
其他的更新版本可以自己去博客里找一下噢。
写于2019/5/8
一个能用的LR1文法:
S' -> <程序>
<程序> -> <声明列表>|<程序> <函数>
<声明列表> -> <声明>|<声明列表> <声明>
<声明> -> include < <标识符> > ;
<函数> -> <修饰符> <标识符> <形式参数> <复合语句>
<修饰符> -> void|int|char|float|double
<标识符> -> id
<形式参数> -> ( <数据类型> <标识符> )
<数据类型> -> int|float|double|char
<复合语句> -> { <语句列表> }|{ }
<语句列表> -> <语句>|<语句列表> <语句>
<语句> -> <条件语句>|<赋值语句>|<循环语句>
<赋值语句> -> <标识符> = <表达式> ;
<循环语句> -> while do { <赋值语句> } ;
<条件语句> -> |
-> if { <赋值语句> } else { <赋值语句> }
-> if { <赋值语句> }
-> ( <逻辑表达式> )
<逻辑表达式> -> <标识符> <逻辑运算符> <标识符>
<逻辑运算符> -> >=|<=|<|!|==|!=|>
<表达式> -> <表达式> + T|T
T -> F * F|F / F|F
F -> digit|<标识符>
测试代码:
include ;
void id (int id)
{
while(id > id)
do{id=id*id;};
if(id != id)
{id=id*id;}
}
void id (int id)
{
while(id < id)
do{ id=digit+id* id;};
if(id != id)
{id=id*id;}
}
$
结果:词法分析:
[include, <, id, >, ;, void, id, (, int, id, ), {, while, (, id, >, id, ),
do, {, id, =, id, *, id, ;, }, ;, if, (, id, !=, id, ), {, id, =, id,
*, id, ;, }, }, void, id, (, int, id, ), {, while, (, id, <, id, ), do,
{, id, =, digit, +, id, *, id, ;, }, ;, if, (, id, !=, id, ), {, id, =, id,
*, id, ;, }, }, $]
语法分析结果:
移入include
action I4
移入<
action I13
移入id
action I15
堆栈中的元素:I0 I4 I13 I15
规约<标识符>->id
堆栈中的元素:I0 I4 I13 I14
移入>
action I18
移入;
action I23
堆栈中的元素:I0 I4 I13 I14 I18 I23
规约<声明>->include<<标识符>>;
堆栈中的元素:I0 I3
堆栈中的元素:I0 I3
规约<声明列表>-><声明>
堆栈中的元素:I0 I2
堆栈中的元素:I0 I2
规约<程序>-><声明列表>
堆栈中的元素:I0 I1
移入void
action I7
堆栈中的元素:I0 I1 I7
规约<修饰符>->void
堆栈中的元素:I0 I1 I6
移入id
action I17
堆栈中的元素:I0 I1 I6 I17
规约<标识符>->id
堆栈中的元素:I0 I1 I6 I16
移入(
action I20
移入int
action I25
堆栈中的元素:I0 I1 I6 I16 I20 I25
规约<数据类型>->int
堆栈中的元素:I0 I1 I6 I16 I20 I24
移入id
action I42
堆栈中的元素:I0 I1 I6 I16 I20 I24 I42
规约<标识符>->id
堆栈中的元素:I0 I1 I6 I16 I20 I24 I41
移入)
action I43
堆栈中的元素:I0 I1 I6 I16 I20 I24 I41 I43
规约<形式参数>->(<数据类型><标识符>)
堆栈中的元素:I0 I1 I6 I16 I19
移入{
action I22
移入while
action I38
移入(
action I48
移入id
action I69
堆栈中的元素:I0 I1 I6 I16 I19 I22 I38 I48 I69
规约<标识符>->id
堆栈中的元素:I0 I1 I6 I16 I19 I22 I38 I48 I68
移入>
action I96
堆栈中的元素:I0 I1 I6 I16 I19 I22 I38 I48 I68 I96
规约<逻辑运算符>->>
堆栈中的元素:I0 I1 I6 I16 I19 I22 I38 I48 I68 I89
移入id
action I42
堆栈中的元素:I0 I1 I6 I16 I19 I22 I38 I48 I68 I89 I42
规约<标识符>->id
堆栈中的元素:I0 I1 I6 I16 I19 I22 I38 I48 I68 I89 I117
堆栈中的元素:I0 I1 I6 I16 I19 I22 I38 I48 I68 I89 I117
规约<逻辑表达式>-><标识符><逻辑运算符><标识符>
堆栈中的元素:I0 I1 I6 I16 I19 I22 I38 I48 I73
移入)
action I82
堆栈中的元素:I0 I1 I6 I16 I19 I22 I38 I48 I73 I82
规约->(<逻辑表达式>)
堆栈中的元素:I0 I1 I6 I16 I19 I22 I38 I47
移入do
action I74
移入{
action I88
移入id
action I59
堆栈中的元素:I0 I1 I6 I16 I19 I22 I38 I47 I74 I88 I59
规约<标识符>->id
堆栈中的元素:I0 I1 I6 I16 I19 I22 I38 I47 I74 I88 I79
移入=
action I115
移入id
action I129
堆栈中的元素:I0 I1 I6 I16 I19 I22 I38 I47 I74 I88 I79 I115 I129
规约<标识符>->id
堆栈中的元素:I0 I1 I6 I16 I19 I22 I38 I47 I74 I88 I79 I115 I128
堆栈中的元素:I0 I1 I6 I16 I19 I22 I38 I47 I74 I88 I79 I115 I128
规约F-><标识符>
堆栈中的元素:I0 I1 I6 I16 I19 I22 I38 I47 I74 I88 I79 I115 I101
移入*
action I118
移入id
action I131
堆栈中的元素:I0 I1 I6 I16 I19 I22 I38 I47 I74 I88 I79 I115 I101 I118 I131
规约<标识符>->id
堆栈中的元素:I0 I1 I6 I16 I19 I22 I38 I47 I74 I88 I79 I115 I101 I118 I109
堆栈中的元素:I0 I1 I6 I16 I19 I22 I38 I47 I74 I88 I79 I115 I101 I118 I109
规约F-><标识符>
堆栈中的元素:I0 I1 I6 I16 I19 I22 I38 I47 I74 I88 I79 I115 I101 I118 I139
堆栈中的元素:I0 I1 I6 I16 I19 I22 I38 I47 I74 I88 I79 I115 I101 I118 I139
规约T->F*F
堆栈中的元素:I0 I1 I6 I16 I19 I22 I38 I47 I74 I88 I79 I115 I126
堆栈中的元素:I0 I1 I6 I16 I19 I22 I38 I47 I74 I88 I79 I115 I126
规约<表达式>->T
堆栈中的元素:I0 I1 I6 I16 I19 I22 I38 I47 I74 I88 I79 I115 I124
移入;
action I137
堆栈中的元素:I0 I1 I6 I16 I19 I22 I38 I47 I74 I88 I79 I115 I124 I137
规约<赋值语句>-><标识符>=<表达式>;
堆栈中的元素:I0 I1 I6 I16 I19 I22 I38 I47 I74 I88 I113
移入}
action I122
移入;
action I135
堆栈中的元素:I0 I1 I6 I16 I19 I22 I38 I47 I74 I88 I113 I122 I135
规约<循环语句>->whiledo{<赋值语句>};
堆栈中的元素:I0 I1 I6 I16 I19 I22 I34
堆栈中的元素:I0 I1 I6 I16 I19 I22 I34
规约<语句>-><循环语句>
堆栈中的元素:I0 I1 I6 I16 I19 I22 I31
堆栈中的元素:I0 I1 I6 I16 I19 I22 I31
规约<语句列表>-><语句>
堆栈中的元素:I0 I1 I6 I16 I19 I22 I29
移入if
action I58
移入(
action I46
移入id
action I69
堆栈中的元素:I0 I1 I6 I16 I19 I22 I29 I58 I46 I69
规约<标识符>->id
堆栈中的元素:I0 I1 I6 I16 I19 I22 I29 I58 I46 I68
移入!=
action I95
堆栈中的元素:I0 I1 I6 I16 I19 I22 I29 I58 I46 I68 I95
规约<逻辑运算符>->!=
堆栈中的元素:I0 I1 I6 I16 I19 I22 I29 I58 I46 I68 I89
移入id
action I42
堆栈中的元素:I0 I1 I6 I16 I19 I22 I29 I58 I46 I68 I89 I42
规约<标识符>->id
堆栈中的元素:I0 I1 I6 I16 I19 I22 I29 I58 I46 I68 I89 I117
堆栈中的元素:I0 I1 I6 I16 I19 I22 I29 I58 I46 I68 I89 I117
规约<逻辑表达式>-><标识符><逻辑运算符><标识符>
堆栈中的元素:I0 I1 I6 I16 I19 I22 I29 I58 I46 I67
移入)
action I97
堆栈中的元素:I0 I1 I6 I16 I19 I22 I29 I58 I46 I67 I97
规约->(<逻辑表达式>)
堆栈中的元素:I0 I1 I6 I16 I19 I22 I29 I58 I75
移入{
action I85
移入id
action I80
堆栈中的元素:I0 I1 I6 I16 I19 I22 I29 I58 I75 I85 I80
规约<标识符>->id
堆栈中的元素:I0 I1 I6 I16 I19 I22 I29 I58 I75 I85 I79
移入=
action I115
移入id
action I129
堆栈中的元素:I0 I1 I6 I16 I19 I22 I29 I58 I75 I85 I79 I115 I129
规约<标识符>->id
堆栈中的元素:I0 I1 I6 I16 I19 I22 I29 I58 I75 I85 I79 I115 I128
堆栈中的元素:I0 I1 I6 I16 I19 I22 I29 I58 I75 I85 I79 I115 I128
规约F-><标识符>
堆栈中的元素:I0 I1 I6 I16 I19 I22 I29 I58 I75 I85 I79 I115 I101
移入*
action I118
移入id
action I131
堆栈中的元素:I0 I1 I6 I16 I19 I22 I29 I58 I75 I85 I79 I115 I101 I118 I131
规约<标识符>->id
堆栈中的元素:I0 I1 I6 I16 I19 I22 I29 I58 I75 I85 I79 I115 I101 I118 I109
堆栈中的元素:I0 I1 I6 I16 I19 I22 I29 I58 I75 I85 I79 I115 I101 I118 I109
规约F-><标识符>
堆栈中的元素:I0 I1 I6 I16 I19 I22 I29 I58 I75 I85 I79 I115 I101 I118 I139
堆栈中的元素:I0 I1 I6 I16 I19 I22 I29 I58 I75 I85 I79 I115 I101 I118 I139
规约T->F*F
堆栈中的元素:I0 I1 I6 I16 I19 I22 I29 I58 I75 I85 I79 I115 I126
堆栈中的元素:I0 I1 I6 I16 I19 I22 I29 I58 I75 I85 I79 I115 I126
规约<表达式>->T
堆栈中的元素:I0 I1 I6 I16 I19 I22 I29 I58 I75 I85 I79 I115 I124
移入;
action I137
堆栈中的元素:I0 I1 I6 I16 I19 I22 I29 I58 I75 I85 I79 I115 I124 I137
规约<赋值语句>-><标识符>=<表达式>;
堆栈中的元素:I0 I1 I6 I16 I19 I22 I29 I58 I75 I85 I111
移入}
action I121
堆栈中的元素:I0 I1 I6 I16 I19 I22 I29 I58 I75 I85 I111 I121
规约->if{<赋值语句>}
堆栈中的元素:I0 I1 I6 I16 I19 I22 I29 I55
堆栈中的元素:I0 I1 I6 I16 I19 I22 I29 I55
规约<条件语句>->
堆栈中的元素:I0 I1 I6 I16 I19 I22 I29 I51
堆栈中的元素:I0 I1 I6 I16 I19 I22 I29 I51
规约<语句>-><条件语句>
堆栈中的元素:I0 I1 I6 I16 I19 I22 I29 I50
堆栈中的元素:I0 I1 I6 I16 I19 I22 I29 I50
规约<语句列表>-><语句列表><语句>
堆栈中的元素:I0 I1 I6 I16 I19 I22 I29
移入}
action I49
堆栈中的元素:I0 I1 I6 I16 I19 I22 I29 I49
规约<复合语句>->{<语句列表>}
堆栈中的元素:I0 I1 I6 I16 I19 I21
堆栈中的元素:I0 I1 I6 I16 I19 I21
规约<函数>-><修饰符><标识符><形式参数><复合语句>
堆栈中的元素:I0 I1 I5
堆栈中的元素:I0 I1 I5
规约<程序>-><程序><函数>
堆栈中的元素:I0 I1
移入void
action I7
堆栈中的元素:I0 I1 I7
规约<修饰符>->void
堆栈中的元素:I0 I1 I6
移入id
action I17
堆栈中的元素:I0 I1 I6 I17
规约<标识符>->id
堆栈中的元素:I0 I1 I6 I16
移入(
action I20
移入int
action I25
堆栈中的元素:I0 I1 I6 I16 I20 I25
规约<数据类型>->int
堆栈中的元素:I0 I1 I6 I16 I20 I24
移入id
action I42
堆栈中的元素:I0 I1 I6 I16 I20 I24 I42
规约<标识符>->id
堆栈中的元素:I0 I1 I6 I16 I20 I24 I41
移入)
action I43
堆栈中的元素:I0 I1 I6 I16 I20 I24 I41 I43
规约<形式参数>->(<数据类型><标识符>)
堆栈中的元素:I0 I1 I6 I16 I19
移入{
action I22
移入while
action I38
移入(
action I48
移入id
action I69
堆栈中的元素:I0 I1 I6 I16 I19 I22 I38 I48 I69
规约<标识符>->id
堆栈中的元素:I0 I1 I6 I16 I19 I22 I38 I48 I68
移入<
action I92
堆栈中的元素:I0 I1 I6 I16 I19 I22 I38 I48 I68 I92
规约<逻辑运算符>-><
堆栈中的元素:I0 I1 I6 I16 I19 I22 I38 I48 I68 I89
移入id
action I42
堆栈中的元素:I0 I1 I6 I16 I19 I22 I38 I48 I68 I89 I42
规约<标识符>->id
堆栈中的元素:I0 I1 I6 I16 I19 I22 I38 I48 I68 I89 I117
堆栈中的元素:I0 I1 I6 I16 I19 I22 I38 I48 I68 I89 I117
规约<逻辑表达式>-><标识符><逻辑运算符><标识符>
堆栈中的元素:I0 I1 I6 I16 I19 I22 I38 I48 I73
移入)
action I82
堆栈中的元素:I0 I1 I6 I16 I19 I22 I38 I48 I73 I82
规约->(<逻辑表达式>)
堆栈中的元素:I0 I1 I6 I16 I19 I22 I38 I47
移入do
action I74
移入{
action I88
移入id
action I59
堆栈中的元素:I0 I1 I6 I16 I19 I22 I38 I47 I74 I88 I59
规约<标识符>->id
堆栈中的元素:I0 I1 I6 I16 I19 I22 I38 I47 I74 I88 I79
移入=
action I115
移入digit
action I127
堆栈中的元素:I0 I1 I6 I16 I19 I22 I38 I47 I74 I88 I79 I115 I127
规约F->digit
堆栈中的元素:I0 I1 I6 I16 I19 I22 I38 I47 I74 I88 I79 I115 I101
堆栈中的元素:I0 I1 I6 I16 I19 I22 I38 I47 I74 I88 I79 I115 I101
规约T->F
堆栈中的元素:I0 I1 I6 I16 I19 I22 I38 I47 I74 I88 I79 I115 I126
堆栈中的元素:I0 I1 I6 I16 I19 I22 I38 I47 I74 I88 I79 I115 I126
规约<表达式>->T
堆栈中的元素:I0 I1 I6 I16 I19 I22 I38 I47 I74 I88 I79 I115 I124
移入+
action I138
移入id
action I147
堆栈中的元素:I0 I1 I6 I16 I19 I22 I38 I47 I74 I88 I79 I115 I124 I138 I147
规约<标识符>->id
堆栈中的元素:I0 I1 I6 I16 I19 I22 I38 I47 I74 I88 I79 I115 I124 I138 I146
堆栈中的元素:I0 I1 I6 I16 I19 I22 I38 I47 I74 I88 I79 I115 I124 I138 I146
规约F-><标识符>
堆栈中的元素:I0 I1 I6 I16 I19 I22 I38 I47 I74 I88 I79 I115 I124 I138 I101
移入*
action I118
移入id
action I131
堆栈中的元素:I0 I1 I6 I16 I19 I22 I38 I47 I74 I88 I79 I115 I124 I138 I101 I118 I131
规约<标识符>->id
堆栈中的元素:I0 I1 I6 I16 I19 I22 I38 I47 I74 I88 I79 I115 I124 I138 I101 I118 I109
堆栈中的元素:I0 I1 I6 I16 I19 I22 I38 I47 I74 I88 I79 I115 I124 I138 I101 I118 I109
规约F-><标识符>
堆栈中的元素:I0 I1 I6 I16 I19 I22 I38 I47 I74 I88 I79 I115 I124 I138 I101 I118 I139
堆栈中的元素:I0 I1 I6 I16 I19 I22 I38 I47 I74 I88 I79 I115 I124 I138 I101 I118 I139
规约T->F*F
堆栈中的元素:I0 I1 I6 I16 I19 I22 I38 I47 I74 I88 I79 I115 I124 I138 I148
堆栈中的元素:I0 I1 I6 I16 I19 I22 I38 I47 I74 I88 I79 I115 I124 I138 I148
规约<表达式>-><表达式>+T
堆栈中的元素:I0 I1 I6 I16 I19 I22 I38 I47 I74 I88 I79 I115 I124
移入;
action I137
堆栈中的元素:I0 I1 I6 I16 I19 I22 I38 I47 I74 I88 I79 I115 I124 I137
规约<赋值语句>-><标识符>=<表达式>;
堆栈中的元素:I0 I1 I6 I16 I19 I22 I38 I47 I74 I88 I113
移入}
action I122
移入;
action I135
堆栈中的元素:I0 I1 I6 I16 I19 I22 I38 I47 I74 I88 I113 I122 I135
规约<循环语句>->whiledo{<赋值语句>};
堆栈中的元素:I0 I1 I6 I16 I19 I22 I34
堆栈中的元素:I0 I1 I6 I16 I19 I22 I34
规约<语句>-><循环语句>
堆栈中的元素:I0 I1 I6 I16 I19 I22 I31
堆栈中的元素:I0 I1 I6 I16 I19 I22 I31
规约<语句列表>-><语句>
堆栈中的元素:I0 I1 I6 I16 I19 I22 I29
移入if
action I58
移入(
action I46
移入id
action I69
堆栈中的元素:I0 I1 I6 I16 I19 I22 I29 I58 I46 I69
规约<标识符>->id
堆栈中的元素:I0 I1 I6 I16 I19 I22 I29 I58 I46 I68
移入!=
action I95
堆栈中的元素:I0 I1 I6 I16 I19 I22 I29 I58 I46 I68 I95
规约<逻辑运算符>->!=
堆栈中的元素:I0 I1 I6 I16 I19 I22 I29 I58 I46 I68 I89
移入id
action I42
堆栈中的元素:I0 I1 I6 I16 I19 I22 I29 I58 I46 I68 I89 I42
规约<标识符>->id
堆栈中的元素:I0 I1 I6 I16 I19 I22 I29 I58 I46 I68 I89 I117
堆栈中的元素:I0 I1 I6 I16 I19 I22 I29 I58 I46 I68 I89 I117
规约<逻辑表达式>-><标识符><逻辑运算符><标识符>
堆栈中的元素:I0 I1 I6 I16 I19 I22 I29 I58 I46 I67
移入)
action I97
堆栈中的元素:I0 I1 I6 I16 I19 I22 I29 I58 I46 I67 I97
规约->(<逻辑表达式>)
堆栈中的元素:I0 I1 I6 I16 I19 I22 I29 I58 I75
移入{
action I85
移入id
action I80
堆栈中的元素:I0 I1 I6 I16 I19 I22 I29 I58 I75 I85 I80
规约<标识符>->id
堆栈中的元素:I0 I1 I6 I16 I19 I22 I29 I58 I75 I85 I79
移入=
action I115
移入id
action I129
堆栈中的元素:I0 I1 I6 I16 I19 I22 I29 I58 I75 I85 I79 I115 I129
规约<标识符>->id
堆栈中的元素:I0 I1 I6 I16 I19 I22 I29 I58 I75 I85 I79 I115 I128
堆栈中的元素:I0 I1 I6 I16 I19 I22 I29 I58 I75 I85 I79 I115 I128
规约F-><标识符>
堆栈中的元素:I0 I1 I6 I16 I19 I22 I29 I58 I75 I85 I79 I115 I101
移入*
action I118
移入id
action I131
堆栈中的元素:I0 I1 I6 I16 I19 I22 I29 I58 I75 I85 I79 I115 I101 I118 I131
规约<标识符>->id
堆栈中的元素:I0 I1 I6 I16 I19 I22 I29 I58 I75 I85 I79 I115 I101 I118 I109
堆栈中的元素:I0 I1 I6 I16 I19 I22 I29 I58 I75 I85 I79 I115 I101 I118 I109
规约F-><标识符>
堆栈中的元素:I0 I1 I6 I16 I19 I22 I29 I58 I75 I85 I79 I115 I101 I118 I139
堆栈中的元素:I0 I1 I6 I16 I19 I22 I29 I58 I75 I85 I79 I115 I101 I118 I139
规约T->F*F
堆栈中的元素:I0 I1 I6 I16 I19 I22 I29 I58 I75 I85 I79 I115 I126
堆栈中的元素:I0 I1 I6 I16 I19 I22 I29 I58 I75 I85 I79 I115 I126
规约<表达式>->T
堆栈中的元素:I0 I1 I6 I16 I19 I22 I29 I58 I75 I85 I79 I115 I124
移入;
action I137
堆栈中的元素:I0 I1 I6 I16 I19 I22 I29 I58 I75 I85 I79 I115 I124 I137
规约<赋值语句>-><标识符>=<表达式>;
堆栈中的元素:I0 I1 I6 I16 I19 I22 I29 I58 I75 I85 I111
移入}
action I121
堆栈中的元素:I0 I1 I6 I16 I19 I22 I29 I58 I75 I85 I111 I121
规约->if{<赋值语句>}
堆栈中的元素:I0 I1 I6 I16 I19 I22 I29 I55
堆栈中的元素:I0 I1 I6 I16 I19 I22 I29 I55
规约<条件语句>->
堆栈中的元素:I0 I1 I6 I16 I19 I22 I29 I51
堆栈中的元素:I0 I1 I6 I16 I19 I22 I29 I51
规约<语句>-><条件语句>
堆栈中的元素:I0 I1 I6 I16 I19 I22 I29 I50
堆栈中的元素:I0 I1 I6 I16 I19 I22 I29 I50
规约<语句列表>-><语句列表><语句>
堆栈中的元素:I0 I1 I6 I16 I19 I22 I29
移入}
action I49
堆栈中的元素:I0 I1 I6 I16 I19 I22 I29 I49
规约<复合语句>->{<语句列表>}
堆栈中的元素:I0 I1 I6 I16 I19 I21
堆栈中的元素:I0 I1 I6 I16 I19 I21
规约<函数>-><修饰符><标识符><形式参数><复合语句>
堆栈中的元素:I0 I1 I5
堆栈中的元素:I0 I1 I5
规约<程序>-><程序><函数>
堆栈中的元素:I0 I1
接收!!!!!!!!!!!!!!!!!!!