设为首页 加入收藏

TOP

语义分析:C语言表达式的语法树生成――Python实现(一)
2014-11-23 19:48:25 】 浏览:10020
Tags:语义 分析 语言 表达式 语法 生成 Python 实现
语义分析较困难的根本原因在于语法的可递归性,深层次的递归使得问题的分解看起来变得相当地复杂。但是如果能将递归问题转化为迭代问题,便能很大程度地简化此问题模型。递归转化为迭代的关键在于——找到最深层递归结构的全部特征,迭代化之,问题便迎刃而解。
一般情况下,人们在面对复杂的递归问题时时,亦是依据其语法规则,找到其递归深层的结构,化解之,步步迭代,如此,问题便得到解决。人类的思维很是擅长将递归问题转化为迭代问题,而学习知识的过程,则可以看成是对各种各样语法规则的理解与掌握。
一元操作符、二元操作符的递归问题,可以很简单的转化为迭代,多元操作符的情况稍复杂些。
所有的操作符及其优先级如下图:
如typeof、取地址、指针指向等,在这里并未实现。实现的包括有算数运算式、逻辑运算式、函数调用与括号。对于理解语义分析的过程,已足够。
对于不包含括号与函数的简单表达式,我们语义分析演算过程如下:
我们的数据结构:
复制代码
1 '''
2 ____________________________ Syntax Tree
3 Parenthesis:
4 ["(",None]
5 [")",None]
6 Operators(grouped by precedence):
7 Unary :
8 1 + - ! ~ ["+",None] ["-",None] ["!",None] ["~",None]
9 Binary :
10 2 * / % ["*",None] ["/",None] ["%",None]
11 3 + - ["+",None] ["-",None]
12 4 << >> ["<<",None] [">>",None]
13 5 > >= < <= [">",None] [">=",None] ["<",None] ["<=",None]
14 6 == != ["==",None] ["!=",None]
15 7 & ["&",None]
16 8 ^ ["^",None]
17 9 | ["|",None]
18 10 && ["&&",None]
19 11 || ["||",None]
20 Ternary :
21 12 expr expr : expr [" ",None] [":",None] ["@expr"," :",listPtr0,listPtr1,listPtr2]
22 13 expr , expr , expr...
23 Var,Num,Expr,Function:
24 ["@var","varName"]
25 ["@num","num_string"]
26 ["@expr","Operator",listPtr,...]
27 ["@func","funcName",listPtr1,...]
28 ["@expr_list",["@var"|"@num"|"@expr"|"@func",...],...]
29 '''
复制代码
这是我们最终的代码模块图:
其中形如 module_x_y 的函数,x表示此运算符的优先级,y表示横向序号,从零开始。代码注释已经写得很详细了,请看源代码:
View Code
上面的代码虽然很大,却是最简单的一部分了,其实可以采取一些方法显著地压缩代码量,但是时间有限。
下面给出一元运算符、二元运算符、三元运算符及逗号分隔符的语义分析过程,这是本文的核心代码之一:
复制代码
1 ######################################## global list
2 # construct a module dictionary
3 # module_dic_tuple[priority]['Operator'](lis,i)
4 module_dic_tuple=({}, { '+':module_1_0,'-':module_1_1,'!':module_1_2,'~':module_1_3 },\
5 { '*':module_2_0,'/':module_2_1,'%':module_2_2 }, \
6 { '+':module_3_0,'-':module_3_1 },\
7 { '<<':module_4_0,'>>':module_4_1 },\
8 { '>':module_5_0,'>=':module_5_1,'<':module_5_2,'<=':module_5_3 },\
9 { '==':module_6_0,'!=':module_6_1 },\
10 { '&':module_7_0 },\
11 { '^':module_8_0 },\
12 { '|':module_9_0 },\
13 { '&&':module_10_0 },\
14 { '||':module_11_0 },\
15 { ' :':module_12_0 },\
16 { ',':module_13_0 } )
17
18 operator_priority_tuple=( () , ('+', '-', '!', '~') , ('*','/','%'),\
19 ('+','-'),('<<','>>'),\
20 ('>','>=','<','<='),('==','!='),\
21 ('&'),('^'),('|'),('&&'),('||'),(' ',':'),(',') )
22
23 ############################# parse:unary,binary,ternary,comma expr
24 ########### return value :
25 ############# 0 parsed sucessfully
26 ############# 1 syntax error
27 def parse_simple_expr(lis):
28 if len(lis)==0:
29 return 1
30 #if lis[len(lis)-1][0][0]!='@':
31 # return 1
32 #if lis[0][0][0]!='@' and lis[0][0] not in ('+','-','!','~'):
33 # return 1
34 for pri in range(1,12): # pri 1,2,3,4,5,6,7,8,9,10,11
35 i=0
36 while 1:
37 if len(lis)==1 and lis[0][0][0]=='@':
38 return 0
39 if i>
首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇深入理解C语言----标准I/O小结(.. 下一篇C语言每日小练(二)――开灯问题

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目