⑴ 倪志伟的论文专着
近五年来,在国内外学术期刊上公开发表论文30多篇,其中有15篇论文被EI或ISTP收录。出版的教材或专着有:
1.《Foxpro实用教程》,南京大学出版社,1994年(主编)
2.《用C++建造专家系统》,电子工业出版社,1996年 (副主编)3.《机器学习与智能决策支持系统》,科学出版社,2004年5月(副主编)
4.《编译原理》,北京希望电子出版社,2005年11月(主编)
5.《现代物流技术》,中国物资出版社,2006年1月(主编)(被评为国家“十一五”规划教材)
6.《物流信息系统》,中国物资出版社,2006年2月(副主编)
7. 《智能管理技术与方法》,科学出版社,2007年10月(主编)
8. 《动态数据挖掘》,科学出版社,2010年8月(主编)
近年来,发表的主要学术论文如下: [1] Zhangjun Wu, Xiao Liu, Zhiwei Ni, Dong Yuan, Jinjun Chen, Yun Yang: A Market-Oriented Hierarchical Scheling Strategy in Cloud Workflow Systems, Journal of Supercomputing, Volume 63,Issue 1,pp.256-293,2013.(UT WOS:000313166000013).[2] Xiao Liu,Zhiwei Ni,et al.A Novel Statistical Time-Series Pattern based Interval Forecastting Strategy for Activity Durations in Workflow Systems.Journal of Software and system,2011,(84),354-376.(SCI indexed)[3] Liping Ni, Zhiwei Ni, YaZhuo Gao.Stock trend Prediction Based on Fractal Feature Selection and Support Vector Machine.Expert system with applications,2011,(38),5569-5576.(SCI indexed)[4]Xiao Liu,Zhiwei Ni,et al.A probabilistic strategy for temporal constraint management in scientisfic workflow systems.Concurrrency and Computation :Pratice and Experience,2011,23(16),1893-1919.(SCI indexed) [5] Xiao Liu, Zhiwei Ni, Zhangjun Wu, Dong Yuan, Jinjun Chen, Yun Yang: A Novel General Framework for Automatic and Cost-Effective Handling of Recoverable Temporal violations in Scientific Workflow Systems, Journal of Software and System,2011,(84),492-509. (SCI indexed ) [6]Zhiwei Ni,Junfeng guo ,et al.An Efficient Method for Improving Query Efficiency in Data Warehouse.Journal of software,2011,6(5),857-865.[7]高雅卓, 倪志伟等.连续属性上的OLAP查询建模方法研究.情报学报,2011,30(4),372-379.[8]张以文,倪志伟等.云计算环境下动态虚拟企业伙伴选择模型.计算机科学,2011,38(7),212-215.[9]倪志伟,公维峰等.数据流中随机型分型维数计算方法研究.计算机科学,2011,38(4),209-212.[10]倪志伟,吴昊等.基于改进的经验模态分解的时间序列匹配算法.系统仿真学报,2011,23(11),2395-2399.[11]姜苗,倪志伟等.数据流时间窗口中闭频繁项集的在线挖掘.中国科学技术大学学报,2011,(8),729-745.[12] Zhangjun Wu, Zhiwei Ni, Lichuan Gu, Xiao Liu: A Revised Discrete Particle Swarm Optimization for Cloud Workflow Scheling, 2010 International Conference on Computational Intelligence and Security (CIS2010), Nanning, China, 11-14 Dec. 2010 (EI indexed) [13] Xiao Liu, Zhiwei Ni, Zhangjun Wu, Dong Yuan, Jinjun Chen, Yun Yang: A Framework for Handling Fine-Grained Recoverable Temporal Violations in Scientific Workflows, 16th IEEE International Conference on Parallel and Distributed Systems (ICPADS2010), Shanghai, China, December 7-11, 2010, on Sept. 05, 2010 (EI indexed). [14] Yazhuo Gao, Zhiwei Ni, Yuxiao Zhao.A scheling strategy for OLAM tasks and its application in a financial BI system Business Intelligence and Financial Engneering .2009会议论文集: 435-440 (EI收录) [15] Zhiwei Ni, Dan Han, Gongrang Zhang, Yazhuo Gao.Extension CBR Retrieval.AICI2009:224—227 (EI收录) [16] Zhangjun Wu, Zhiwei Ni,Chang Zhang, Lichuan Gu. A Novel PSO for Multi-stage Portfolios Planning, IEEE International Conference on Artificial Intelligence and Computational Intelligence (AICI2009),71—77 (EI收录) [17] Chang Zhang, Zhiwei Ni, Zhangjun Wu,Lichuan Gu. A Novel Swarm Model with Quasi-Oppositional Particle, International Forum on Information Technology and Applications (IFITA 2009), pp.325-330 (EI收录) [18] Li Fenggang, Wang Xiaolu, Ni Zhiwei, Ni Liping. Semantic Analysis Based Literature Transaction System of Xi-An Medical Authority, Intelligent Information Management Systems and Technologies (2010),Volume6,No.3 ,219—226 [19] Xiao Liu, Jinjun Chen, Zhangjun Wu, Zhiwei Ni, Dong Yuan, Yun Yang.Handling Recoverable Temporal Violations in Scientific Workflow Systems: A, Workflow Rescheling Based Strategy,2010,pp.534-537 [20]Chao Wang ,Zhi-wei Ni ,Jun-fen Guo.A Fast Bidirectional Method for Mining Maximal Frequent Itemsets,The Third International Joint Conference on Computational Sciences and Optimization (CSO 2010),447—450 [21]倪志伟,高雅卓,李伟东,束建华.基于矩阵的增量式关联规则挖掘算法.计算机工程与应用, 2008,44(13):153-155 [22]刘斌,倪志伟,赵敏.基于属性重要性的贪心算法的改进算法.合肥工业大学学报,2010,33(8):1185-1188 [23]王丽红,倪志伟, 高雅卓.改进的蚁群算法求解多目标车间作业调度问题.计算机技术与发展,2008 ,18(10):49—52 [24]吴姗,倪志伟,罗贺,郑盈盈.一种基于密度的无监督联系发现方法.中国管理科学,2008,16:29—32 [25]梁敏君,倪志伟,倪丽萍,杨葛钟啸.基于网格与分形维数聚类算法.计算机应用,2009,29(3):830-833 [26]倪丽萍,倪志伟,吴昊,叶红云.基于分形维数和蚁群算法的属性选择方法.模式识别与人工智能, 2009,22(2):293—298(EI收录) [27]倪志伟,倪丽萍,杨葛钟啸.分形技术在案例库维护中的应用.计算机应用,2009,29(6):1598—1604 [28]倪志伟,吴姗,胡汤磊.联系发现在证券客户划分中的应用研究.计算机工程与应用, 2009, 45(18):201--204 [29]Dan Han, Zhiwei Ni, Gongrang Zhang, Hongyu Wang, Jun Yan. Research and Design the Extension Case BaseBased on CBR. BIFE International meeting, 2009,:210—214 (EI收录) [30]郑盈盈,倪志伟,吴姗,王丽红.基于移动网格和密度的数据流聚类算法.计算机工程与应用,2009,45(8):129--131 [31]王园园,倪志伟,赵裕啸,伍章俊.基于决策树的模糊聚类评价算法及其应用.计算机技术与发展, 2009,19(9):232-235 [32]严军,倪志伟,王宏宇,韩丹.案例推理在汽车诊断中的应用.计算机应用研究. 2009,26(10):3846-3848 [33]刘慧婷,倪志伟.基于EMD与交叉覆盖算法的个人信用的评估.计算机工程与设计,2009,10:4472—4491 [34]刘慧婷,倪志伟.基于EMD与K-means算法的时间序列聚类.模式识别与人工智能,2009.10 :803—808 [35]倪志伟,李建洋,李锋刚, 杨善林.案例决策技术及案例决策支持系统研究综述.计算机科学,2009,36(11):18—23 [36]郭峻峰, 倪志伟, 高雅卓, 伍章俊.一种提高数据仓库查询效率的有效方法.计算机集成制造系统, 2009,15(12):2451-2457 (EI收录) [37]高雅卓,倪志伟,郭峻峰,胡汤磊.用户兴趣驱动的冰山数据立方体构建及更新方法研究.计算机科学, 2009,36(12):179-182 [38]赵裕啸,倪志伟,王园园,伍章俊.SQL Server 2005数据挖掘技术在证券客户忠诚度的应用.计算机技术与发展, 2010,20(2):229-232 [39]李锋刚,倪志伟, 郜峦.案例推理和多策略相似性检索的中医处方自动生成.计算机应用研究,2010, 27(2):544—547 [40]李建洋,倪志伟,郑金彬,谢秀珍.案例知识维护技术的研究进展.武汉工程大学学报,2010,32(3):96-99 [41]赵敏,倪志伟,刘斌.K-means与朴素贝叶斯在商务智能中的应用.计算机技术与发展, 2010,20(4):179-182 [42]王宏宇,倪志伟,严军,韩丹.灰度关联理论在CBR中的应用研究.计算机技术与发展, 2010,20(5):96-100 [43]罗义钦,倪志伟,杨葛钟啸.一种新的数据流分形聚类算法.计算机工程与应用, 2010,46 (6): 136-13 [44]查春生,倪志伟,倪丽萍,公维峰.基于相空间重构的股指时间序列相关性分析,计算机技术与发展,计划在2010年第8期刊载 [45]姜苗,倪志伟,王超,戴奇波.在线挖掘数据流混合窗口中闭频繁项集,系统仿真学报, [46]辜丽川,倪志伟,张友华.一种基于核矩阵迭代学习的范例相似度算法,模式识别与人工智能。 [47] Case base maintenance based on outlier data mining,Proc. 4th Intl. Conf. on Machine Learning and Cybernetics,IEEE Press, China, 2005.8 ,2861-2864 [48] 基于相似粗糙集的案例特征项的约简维护, 计算机科学,Vol.32,No.8.A , 2005,93-96 [49] 数据流管理与挖掘研究, 合肥工业大学学报(自然科学版), Vol.28, No.9 , 2005,1157-1162 [50] Case-Based Reasoning Framework Based On Data Mining Technique. Proceedings of the Third International Conference on Machine Learning and Cybernetics, Shanghai, August,2004,2511-2514 [51] 基于案例和规则相结合的推理技术,小型微型计算机系统,2004,Vol.25,No.7,1155-1158 [52] 集成范例推理系统的研究,系统仿真学报,2004,Vol.16,No.4, 803-806 [53] 范例推理中范例自动获取的数据挖掘技术,天津大学学报,2003年,Vol.36,No.1,82-86 [54] 基于知识发现的范例推理系统,计算机科学,Vol.30,No.5,2003年,26-29 [55] 范例推理系统中的范例库维护,小型微型计算机系统,Vol.24, No.10,2003年10月,1825-1828 [56] Integrated case-based reasoning,Proceedings of 2003 International Conference on Machine Learning and Cybernetics ,Xi’an,2003,1845-1849 [57]范例推理中的知识发现技术,小型微型计算机系统,Vol.23,No.2,2002年2月,159-162 [58]范例库中特征项权重的发现技术,厦门大学学报, Vol.41,No.2,2002年3月,168-172 [59]用神经网络来实现基于范例的推理系统,计算机工程,2002年7月,Vol.28,No.7 [60]A neural network case-based reasoning and its application , Proceedings of 2002 International Conference on Machine Learning and Cybernetics ,Beijing, 2002.11,529-532 [61]范例库上的知识发现,南开大学学报,2002年12月,Vol.35,No.4 [62]神经网络专家系统及其数据挖掘技术的探讨,系统工程学报,2001年,Vol.16, No.1, 61-65
⑵ 给定文法G[E]:E->T+E| T,T->num,给出句子2+ 3- 4的最左...
编译原理呀,好理论.这种题目解题其实先构建语法树,然后根据语法树来写最左最右推导比较方便.不过题目好像不对,没有定义减号(-),所以文法分析应该失败的.如果句子为
2+3+4的话,那么:语法树应为:ET
+
E2
T
+
E3
T4最左推导为:E->T+E->2+E->2+T+E->2+3+E->2+3+T->2+3+4最右推导为:E->T+E->T+T+E->T+T+T->T+T+4->T+3+4->2+3+4
⑶ 大学软件工程专业教材都有哪些
ST软件工程免费下载
链接:https://pan..com/s/1zesJfTuWTpPplC7Yf4YusQ
ST是指境内上市公司被进行特别处理的股票,也是退市风险警示。ST股是指境内上市公司经营连续两年亏损,被进行退市风险警示的股票。
⑷ 编译原理的题目:对于文法G(E):E→T|E+T|E-T T→F|T*F|T/F F→(E)|i
终极符集合Vt={+,-,*,/,(,),i}
非终极符集合Vi={E,T,F}
最右推导:E => E-T => E-F => E-(E) => E-(T) => E-(T+F) => E-(T+i) => E-(T*F+i)
直接短语:T*F,i
⑸ 编译原理左递归消除
这些题很难啊!!!
都有间接左递归。要先变成直接左递归,然后消除掉。
--------------------
G3.1
S->SA|Ab|b|c
A->Bc|a
B->Sb|b
--------------------
间接左递归转直接左递归
B代入A:A ->(Sb|b)c|a -> Sbc|bc|a
A代入S:S -> S(Sbc|bc|a)|(Sbc|bc|a)b|b|c -> SSbc|Sbc|Sa|Sbcb|bcb|ab|b|c
消除直接左递归
S->bcbS'|abS'|bS'|cS'
S'->SbcS'|bcS'|aS'|bcbS'|ε
S'还是有直接左递归,继续消除
S'->bcS'T|aS'T|bcbS'T
T->bcS'T|ε
最后,这题答案就是S,S',T的产生式
--------------------
下面两题更难了,上一题反复代入还能把其他非终结符消掉,下面两个文法都是最后代入还剩下两个非终结符反复迭代,佛了!
G3.2
E->ET+|T
T->TF*|F
F->E|i
--------------------
F代入T: T->T(E|i)*|(E|i)->TE*|Ti*|E|i
T代入E:
--------------------
G3.3
S->V_1
V_1->V_2|V_1 2 V_2
V_2->V_3|V_2 + V_3
V_3->V_1 * |(
这些字母我都不认识了,换一下
S->A|SiA
A->B|A+B
B->S*|(
--------------------
B代入A:A->(S*|()|A+(S*|()->S*|(|A+S*|A+(
A代入S:
--------------------
⑹ 编译原理中无符号整数/无符号偶数的文法是什么
无符号整数: 开头不能为 0 的任意长度的数字串
S->TE//S表示以[1-9]开头的任意长度的字符串,也就是无符号整数啦。
E->ED|ε//E表示任意长度数字串或空串
D->T|0//D表示[0-9]的终结符
T->1|...|9//T表示[1-9]的终结符
无符号偶数: 以0, 2, 4, 6, 8 结尾的任意长度的数字串。
S->ET//S表示以02468结尾的任意长度的数字串。
E->Ed|ε//E表示任意长度的数字串或空串。
D->0|1|2|...|9//D表示[0-9]中任意一个数字。
T->0|2|4|6|8//T表示偶数单个数字。
⑺ 编译原理问题,高手进。
回答下列问题:(30分)
(6分)对于下面程序段
program test (input, output)
var i, j: integer;
procere CAL(x, y: integer);
begin
y:=y*y; x:=x-y; y:=y-x
end;
begin
i:=2; j:=3; CAL(i, j)
writeln(j)
end.
若参数传递的方法分别为(1)传值、(2)传地址,(3)传名,请写出程序执行的输出结果。
答: (1) 3 (2) 16 (3) 16 (每个值2分)
(6分)计算文法G(M)的每个非终结符的FIRST和FOLLOW集合,并判断该文法是否是LL(1)的,请说明理由。
G(M):
M → TB
T → Ba |
B → Db | eT |
D → d |
解答:
计算文法的FIRST和FOLLOW集合:(4分)
FIRST(M) = { a,b,e,d, } FIRST(T) = { a,b,e,d, }
FIRST(B) = {b,e,d, } FIRST(D) = {d,}
FOLLOW (M) = {#} FOLLOW (T) = { a,b,e,d,#}
FOLLOW (B) = {a,# } FOLLOW (D) = { b}
检查文法的所有产生式,我们可以得到:
1. 该文法不含左递归,
2. 该文法中每一个非终结符M,T,B,D的各个产生式的候选首符集两两不相交。
3. 该文法的非终结符T、B和D,它们都有候选式,而且
FIRST(T)∩FOLLOW(T)={ a,b,e,d }≠
所以该文法不是LL(1)文法。(2分)
(4分)考虑下面的属性文法
产 生 式 语 义 规 则
S→ABC
A→a
B→b
C→c B.u := S.u
A.u := B.v + C.v
S.v := A.v
A.v :=3*A.u
B.v := B.u
C.v := 1
画出字符串abc的语法树;
对于该语法树,假设S.u的初始值为5,属性计算完成后,S.v的值为多少。
答:(1) (2分)
(2) S.v的值为18 (2分)
(4分)运行时的DISPLAY表的内容是什么?它的作用是什么?
答:DISPLAY表是嵌套层次显示表。每当进入一个过程后,在建立它的活动记录区的同时建立一张嵌套层次显示表diaplay.假定现在进入的过程层次为i,则它的diaplay表含有i+1个单元,自顶向下每个单元依次存放着现行层、直接外层、…、直至最外层(主程序,0层)等每层过程的最新活动记录的起始地址。通过DISPLAY表可以访问其外层过程的变量。
(5分)对下列四元式序列生成目标代码:
A:=B*C
D:=E+A
G:=B+C
H:=G*D
其中,H在基本块出口之后是活跃变量, R0和R1是可用寄存器。
答: 目标代码序列
LD R0 B
MUL R0 C
LD R1 E
ADD R1 R0
LD R0 B
ADD R0 C
MUL R0 R1
ST R0 H
(5分)写出表达式a+b*(c-d)对应的逆波兰式、三元式序列和抽象语法树。
答:
逆波兰式:(abcd-*+) (1分)
三元式序列: (2分)
OP ARG1 ARG2
(1) - c d
(2) * b (1)
(3) + a (2)
抽象语法树:(2分)
(8分)构造一个DFA,它接受={a,b}上所有包含ab的字符串。
答:
(2分)构造相应的正规式:(a|b)*ab(a|b)*
(3分)
a a
a b
b b
(3分)确定化:
I
{0,1,2} {1,2,3} {1,2}
{1,2,3} {1,2,3} {1,2,4,5,6}
{1,2} {1,2,3} {1,2}
{1,2,4,5,6} {1,2,3,5,6} {1,2,5,6}
{1,2,3,5,6} {1,2,3,5,6} {1,2,4,5,6}
{1,2,5,6} {1,2,3,5,6} {1,2,5,6}
b b
b a
a a a a
a b b
b
最小化:
{0,1,2} {3,4,5}
{0, 2},1, {3,4,5}
(6分)写一个文法使其语言为L(G)={anbncm| m,n≥1,n为奇数,m为偶数}。
答:
文法G(S):
(8分)对于文法G(S):
1. 写出句型b(Ma)b的最右推导并画出语法树。
2. 写出上述句型的短语,直接短语和句柄。
答:
1. (4分)
2. (4分)
短语: Ma), (Ma), b(Ma)b
直接短语: Ma)
句柄: Ma)
(12分)对文法G(S):
S → a | ^ | (T)
T → T,S | S
(1) 构造各非终结符的FIRSTVT和LASTVT集合;
(2) 构造算符优先表;
(3) 是算符优先文法吗?
(4) 构造优先函数。
答:
(1) (4分)
(2) (4分)
a ^ ( ) ,
a > >
^ > >
( < < < = <
) > >
, < < < > >
(3) 是算符优先文法,因为任何两个终结符之间至多只有一种优先关系。 (1分)
(4) 优先函数(3分)
a ^ ( ) ,
F 4 4 2 4 4
G 5 5 5 2 3
(8分)设某语言的do-while语句的语法形式为
S do S(1) While E
其语义解释为:
针对自下而上的语法分析器,按如下要求构造该语句的翻译模式,将该语句翻译成四元式:
(1) 写出适合语法制导翻译的产生式;
(2) 写出每个产生式对应的语义动作。
答:(1). 适合语法制导翻译的文法(4分)
G(S):
R do
UR S(1) While
SU E
(2). (4分)
R do
{ R.QUAD:=NXQ }
UR S(1) While
{ U.QUAD:=R.QUAD;
BACKPATCH(S.CHAIN, NXQ) }
SU E
{ BACKPATCH(E.TC, U.QUAD);
S.CHAIN:=E.FC }
答案二:
(1) S do M1 S(1) While M2 E
M ε (4分)
(2) M ε { M.QUAD := NXQ } (4分)
S do M1 S(1) While M2 E
{
BACKPATCH(S(1).CHAIN, M2.QUAD);
BACKPATCH(E.TC, M1.QUAD);
S.CHAIN:=E. FC
}
(10分)将语句
while C>0 do if A B=0 then C:=C+D else C:=C*D
翻译成四元式。
答:
100 (j>, C, 0, 102)
101 (j, -, -, 112)
102 (jnz, A, -, 106)
103 (j, -, -, 104)
104 (j=, B, 0, 106)
105 (j, -, -, 109)
106 (+, C, D, T1)
107 (:=, T1, -, C)
108 (j, -, -, 100)
109 (*, C, D, T2)
110 (:=, T2, -, C)
111 (j, -, -, 100)
112
(10分)设有基本块如下:
T1:=3
T2:=A*B
T3:=9+T1
M:=A*B
T4:=C-D
L:=T3*T4
T2:=C+D
N:=T2
画出DAG图;
设L,M,N 是出基本块后的活跃变量,请给出优化后的四元式序列。
答:
1. (6分)
L
*
T2,M T4 T2,N
* - +
T1 T3
3 A B 12 C D
2. (4分)
M:=A*B
S1:=C-D
L:=12*S1
N:=C+D
(8分)文法G(S)及其LR分析表如下,请给出串baba#的分析过程。
(1) S → DbB (2) D → d (3) D → ε
(4) B → a (5) B → Bba (6) B → ε
LR分析表
ACTION GOTO
b D a # S B D
0 r3 s3 1 2
1 acc
2 s4
3 r2
4 r6 S5 r6 6
5 r4 r4
6 s7 r1
7 S8
8 r5 r5
解答:
步骤 状态 符号 输入串
0 0 # baba#
1 02 #D baba#
2 024 #Db aba#
3 0245 #Dba ba#
4 0246 #DbB ba#
5 02467 #DbBb a#
6 024678 #DbBba #
7 0246 #DbB #
8 01 #S # acc
哈哈,估计认识!!
⑻ 编译原理题目
明天写了给你吧。这实在略多了点
⑼ 编译原理文法分析
改完了,能文法分析出来了!!
大概 跟你说下 你的错误吧:
出错地点:
1.声明的stack[50]没有初始化;
2.stack的入栈是错误的,按照你的方式,如果原来有TM,再加入T->FN,则M就被挤出来了.(这里很关键,你对照我给你改的再看看)
3.s指针在你入栈操作以后并没有指向栈顶,而是保持了不变,这肯定是有问题的.(传入push函数的时候直接传参数s就好了.)
4.if(*s==*p){***}else{}的else的右括号管辖的范围 有错误
不嫌弃的话,可以去http://blog.csdn.net/fangguanya,我的BLOG,不怎么充实,呵呵,有这个程序的运行结果的. 谢谢 呵呵.
总之你对照我给你改的再看看吧. 我把我的测试输出 也给保留了.你好对照点.
(PS.我用的vs2005,用的时候你改下头申明,其他一样)
// grammar.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include<iostream>
using namespace std;
char * spush(char *stack,char *pt);
bool analyse(char *p);
void main()
{
//将分析串存放在二维数组中
char input[5][10]={"i+i#",
"i*(i+i)#",
"i*i+i#",
"i+*#",
"+i*i#"};
bool flag; //定义一个布尔型的标记量
for(int h=0;h<5;++h)
{
flag=analyse(input[h]);
if(flag) cout<<"恭喜你!"<<input[h]<<"语法分析成功,合法!"<<endl;
else cout<<"对不起!"<<input[h]<<"语法分析失败,非法!"<<endl;
}
int aaa;
cin>>aaa;
}
//定义各一将串逆序入栈的函数
char * spush(char *stack,char *pt)
{
int l=0;
//while循环的作用是将指针指向字符串的末尾,然后再由后向前入栈,从而实现逆序
while(*pt!='\0')
{
pt++;
l++;
}
if (*stack == '#')
{
stack++;
}
while(l)
{
pt--;
char cTempIntoStack = (*pt);
*stack=cTempIntoStack;
stack++;
l--;
}
stack--; //由于前面向前加了一位,要返回
////////////////
return stack;
///////////////////////////////////
}
/*LL(1)分析表
i + * ( ) #
E TM +TM
F i (E)
M TM e e
N e *FN e e
T FN FN
*/
//分析函数
bool analyse(char *p){
char analyseTable[5][6][4]={
"TM", "", "", "TM", "", "",
"i", "", "", "(E)", "", "",
"", "+TM", "", "", "e", "e",
"", "e", "*FN", "", "e", "e",
"FN", "", "", "TN", "", ""
};
char *stack = new char[50]; //定义一个栈空间
for (int iStack = 0;iStack<50 ;iStack++)
{
stack[iStack] = 0;
}
char *s=stack; //用指针*s指向栈的起始地址
*s='#'; //将“#”入栈
s++; //指针加1
*s='E'; //将“E”入栈
//下面的while循环实现字符串的词法分析操作
int count = 0;
while(*s!='#' || *p!='#'){
count++;
char * temp = s;
cout<<"NO."<<count<<endl;
cout<<"STACK"<<endl;
while (*temp != '#')
{
cout<<*temp<<" ";
temp--;
}
cout<<endl;
int x,y;
//若果栈顶数据和分析串的字符匹配,则将符号栈的栈顶数据出栈(即将栈顶指针减1)
if(*s==*p){
cout<<"Before :"<<*s<<endl;
s--;
p++;
cout<<"After :"<<*s<<endl;
}
//当符号栈和分析串的字符不匹配时,查分析表
else {
switch(*s){
case 'E':x=0;break;
case 'F':x=1;break;
case 'M':x=2;break;
case 'N':x=3;break;
case 'T':x=4;break;
default:return false;
}
switch(*p){
case 'i':y=0;break;
case '+':y=1;break;
case '*':y=2;break;
case '(':y=3;break;
case ')':y=4;break;
case '#':y=5;break;
default:return false;
}
//若果对应的为空,则分析串非法,退出
if(analyseTable[x][y][0]=='\0') return false;
//若查表所对应的为'e',则将符号栈的栈顶数据出栈
else if(analyseTable[x][y][0]=='e') s--;
//其它,这时将查表所得的项逆序入符号栈
else {
s=spush(s,analyseTable[x][y]);
}
}
}
return true; //分析成功,返回
}