CN102236574A - 一种可视化表示和解释c/c++语言声明语句的方法 - Google Patents
一种可视化表示和解释c/c++语言声明语句的方法 Download PDFInfo
- Publication number
- CN102236574A CN102236574A CN2011101726642A CN201110172664A CN102236574A CN 102236574 A CN102236574 A CN 102236574A CN 2011101726642 A CN2011101726642 A CN 2011101726642A CN 201110172664 A CN201110172664 A CN 201110172664A CN 102236574 A CN102236574 A CN 102236574A
- Authority
- CN
- China
- Prior art keywords
- statement
- pel
- symbol
- declarative
- call
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Images
Landscapes
- Management, Administration, Business Operations System, And Electronic Commerce (AREA)
Abstract
一种可视化表示和文字描述C/C++语言声明语句的方法,包括以下步骤:(1)将待分析的函数源代码解析为数据信息表;(2)用树形结构表示出数据信息表的内容;(3)图元、基本词汇与解释的关联;(4)将需要解析的声明语句的作预处理:(5)查找变量在声明语句中的位置;(6)结合图元和基本词汇对声明语句进行解析:首先,查找变量的规则,找出变量在词法表中的位置,初始指针指向变量在词法表中的下一个元素,然后,依据指针指向词法表中的元素调用相应的图元和词汇,最后,当指针指向词法表的最后一个元素“;”时,调用元素相应的图元和词汇,声明语句解析结束。本发明能有效提高阅读程序的效率、有效帮助理解程序、实用性良好。
Description
技术领域
本发明涉及本发明涉及计算机程序理解技术和计算机可视化方法。
背景技术
C/C++语言声明语句的语法比较复杂,尽管实际中可以避免使用过于复杂的声明,但懂得如何理解和使用这些复杂的声明也是很重要,有时也的确需要这种的声明,因为这种声明可以生成更高效、更紧凑的代码。
本方法用于在程序理解中有效实现机器理解C/C++语言中的复杂声明。
目前为止,国内外还没有一套完善地解释C/C++语言的声明语句的程序理解方法。
发明内容
为了克服已有C/C++语言声明语句的阅读效率较低、实用性较差的不足,本发明提供一种提高阅读程序的效率、有效帮助理解程序、实用性良好的可视化表示和解释C/C++语言声明语句的方法。
本发明解决其技术问题所采用的技术方案是:
一种可视化表示和文字描述C/C++语言声明语句的方法,该方法包括以下步骤:
(1)将待分析的函数源代码解析为数据信息表;
(2)用树形结构表示出数据信息表的内容;
(3)图元、基本词汇与解释的关联;
定义1用于可视化表示C/C++语言声明语句的基本图形符号称为图元;
定义2用于构成描述声明语句语意的语句片段称为基本词汇;
定义3通过程序理解将一些基本词汇组合为一条声明语句的解释称为语义描述;
声明语句可视化表示图由图元组合而成,而声明语句的语义描述则需要相关语句来构成;
(4)将需要解析的声明语句的作以下预处理:
4.1将需要解析的声明语句进行标准化处理;
4.2将标准化后的声明语句进行词法分析,再将词法分析声明语句后词法标志都存储在词法表内;
4.3判断声明语法的合法性;如果声明语句不合法,则终止对这个错误的声明进行分析,并输出错误原因。
(5)查找变量在声明语句中的位置
在声明语句中,从左往右读,设定第一个满足以下条件的词为变量:
条件1:当前标识符不是类型说明符并且下一个词是符号“;”或符号“,”,符号“=”,符号“[”,符号“)”,符号“:”;
条件2:当前标识符不是类型说明符并且下一个词是符号“(”并且与符号“(”相匹配的符号“)”的下一个词是符号“;”或符号“=”,符号“:”,符号“)”;
(6)结合图元和基本词汇对声明语句进行解析
首先,利用步骤(5)查找变量的规则,找出变量在词法表中的位置,初始指针指向变量在词法表中的下一个元素,然后,依据指针指向词法表中的元素调用相应的图元和词汇,最后,当指针指向词法表的最后一个元素“;”时,调用元素相应的图元和词汇,声明语句解析结束。
作为优选的一种方案:所述步骤(3)中,设定声明语句的可视化表示常用图元符号为表1:
图元序号 | 图元 |
1 | 图元1 |
2 | 图元2 |
3 | 图元3 |
4 | 图元4 |
5 | 图元5 |
表1
以及设定表2为构成描述语句的基本词汇列表;
表2
所述步骤(6)中,声明语句的解析遵守以下规则:
规则1:查找变量在词法表中的位置,在绘图板上输出变量名,并调用构成描述语句的基本词汇列表中的语句1;初始指针指向变量在词法表中的下一个元素;
规则2:若当前指针指向的词是括号“(”,则根据与括号“(”相匹配的括号“)”之间内容来决定是调用声明语句的可视化表示常用图元符号表中的图元4和构成描述语句的基本词汇列表中的语句8还是调用可视化表示常用图元符号表中的图元5和构成描述语句的基本词汇列表中的语句9;指针指向与括号“(”相匹配的括号“)”的下一个元素;
规则3:若当前指针指向的词是括号“[”,则根据与括号“[”相匹配的括号“]”之间内容来决定可视化表示常用图元符号表中的图元3中数组的大小和是调用构成描述语句的基本词汇列表中的语句6还是调用构成描述语句的基本词汇列表中的语句7;指针指向与括号“[”相匹配的括号“]”的下一个元素;
规则4:若当前指针指向的词是括号“)”,则根据与括号“)”相匹配的括号“(”之间符号“*”的个数来决定可视化表示常用图元符号表中的图元1或图元2和构成描述语句的基本词汇列表中的语句2、3、4、5的调用次数。若符号“*”的下一个词是“const”,则调用可视化表示常用图元符号表中的图元2和构成描述语句的基本词汇列表中的语句3或语句5,否则的话调用可视化表示常用图元符号表中的图元1和构成描述语句的基本词汇列表中的语句2或语句4;指针指向括号“)”的下一个元素;
规则5:若当前指针指向的词是符号“;”,则查看声明语句中未经处理过的符号“*”的个数。符号“*”的个数决定了可视化表示常用图元符号表中的图元1或图元2和构成描述语句的基本词汇列表中的语句2、3、4、5的调用次数。若符号“*”的下一个词是“const”,则调用可视化表示常用图元符号表中的图元2和构成描述语句的基本词汇列表中的语句3或语句5,否则的话调用可视化表示常用图元符号表中的图元1和构成描述语句的基本词汇列表中的语句2或语句4;若类型说明符中含有“const”则调用可视化表示常用图元符号表中的图元2和调用构成描述语句的基本词汇列表中的语句11,否则的话调用可视化表示常用图元符号表中的图元1和调用构成描述语句的基本词汇列表中的语句10;解析完毕。
本发明的有益效果主要表现在:提高阅读程序的效率、有效帮助理解程序、实用性良好。
附图说明
图1是表1中的图元1的示意图;
图2是表1中的图元2的示意图;
图3是表1中的图元3的示意图;
图4是表1中的图元4的示意图;
图5是表1中的图元5的示意图;
图6是例1中声明语句的可视化表示的实验结果。
具体实施方式
下面结合附图对本发明作进一步描述。
参照图1~图5,一种可视化表示和解释C/C++语言声明语句的方法,该方法包括以下步骤:
步骤1:将待分析的函数源代码解析为数据信息表。
步骤2:用树形结构表示出数据信息表的内容。
步骤3:图元、基本词汇与解释的关联:对某一声明语句或定义进行声明语句解释,则将该声明语句存入声明语句队列;若需要对程序中的某一条表达式的所有变量的声明语句进行解释,则先查找表达式中所有变量的声明语句,再将这些声明语句存入声明语句列表。
定义1用于可视化表示C/C++语言声明语句的基本图形符号称为图元。
声明语句可视化表示图由图元组合而成,图元如表1所示。而声明语句的语义描述则需要相关语句来构成,如表2所示的语句描述。
表1声明语句的可视化表示常用图元符号
图元序号 | 图元 |
1 | 图元1 |
2 | 图元2 |
3 | 图元3 |
4 | 图元4 |
5 | 图元5 |
定义2用于构成描述声明语句语意的语句片段称为基本词汇。
定义3通过程序理解将一些基本词汇组合为一条声明语句的解释称为语义描述。
表2构成描述语句的基本词汇列表
步骤4:将需要解析的声明语句的作以下预处理
步骤4.1:将需要解析的声明语句进行标准化处理。需要标准化的声明语句有以下几种情况:
(1)变量的声明时同时进行初始化,即变量的定义。例如:
声明语句
int p=10;
我们需要将它标准化为:
int p;
(2)去掉不必要的前缀说明符。例如:声明语句
extern int p;
我们需要将它标准化为:
int p;
前缀说明符包括“inline”、“friend”、“virtual”、“extern”、“static”、“auto”、“register”、“signed”和“unsigned”。需要注意的是说明符“const”在以后的声明语句解释中用到,因此,这里不把它删去。
(3)去掉修饰成员函数的说明符“const”。例如:声明语句
int Display()const;
我们需要将它标准化为:
int Display();
(4)检测声明语句的标识符是否存在于别名列表typedefList,若存在,则用别名的原型替换。例如:以下一段代码
typedef int*(*pFun)(int,char*);
pFun a[5];
pFun的原型是int*(*)(int,char*);若要对声明语句pFuna[5];
进行解释,则先检测别名列表typedefList中是否存有该语句中的表示符。这里我们检测到别名列表含有声明语句中的pFun,则在声明语句中用pFun的原型替换掉pFun。
标准化声明语句pFun a[5];
int*(*+a[5]+)(int,char*);
标准化后的声明语句:
int*(*a[5])(int,char*);
步骤4.2:将标准化后的声明语句进行词法分析,其中词法标志为:
将词法分析声明语句后词法标志都存储在词法表内。
步骤4.3:判断声明语句语法的合法性
在对声明语句进行可视化表示和语义描述之前,还需要判断这个声明语句是否合法。如果声明语句不合法,则终止对这个错误的声明进行分析,并输出错误原因。不合法的声明语句类型如表3所示:
表3为错误列表
步骤5:查找变量在声明语句中的位置
在通常情况下,在一条声明语句中,从左往右读,第一个标识符即第一个不是类型说明符的词为变量。例如:在声明语句
LRESULT CALLBACK WinSunProc(HWND hwnd,UINTuMsg,WPARAM wParam,LPARAM lParam);
由于导入头文件stdio.h,LRESULT和CALLBACK这两个词都成类型说明符。若对系统文件也进行分析,则在信息抽取过程中将花费大量的时间在分析系统文件上。但若不分析系统文件,则程序中的很多类型说明符都将成为标识符。如何在不分析系统文件的情况下,找出变量在声明语句中的位置成为了解决问题的关键。为了判断在声明语句中变量的位置,我们引入以下规则
规则:在声明语句中,从左往右读,第一个满足以下条件的词为变量。
条件1:当前标识符不是类型说明符并且下一个词是符号“;”或符号“,”,符号“=”,符号“[”,符号“)”,符号“:”;
条件2:当前标识符不是类型说明符并且下一个词是符号“(”并且与符号“(”相匹配的符号“)”的下一个词是符号“;”或符号“=”,符号“:”,符号“)”。
步骤6:结合表1中的图元和表2中的基本词汇列表对声明语句进行解析。
首先,利用以上查找变量的规则,找出变量在词法表中的位置。初始指针指向变量在词法表中的下一个元素。然后,依据指针指向词法表中的元素调用相应的图元和词汇。最后,当指针指向词法表的最后一个元素“;”时,调用元素相应的图元和词汇,声明语句解析结束。
声明语句的解析遵守以下规则:
规则1:查找变量在词法表中的位置,在绘图板上输出变量名,并调用表2中的语句1;初始指针指向变量在词法表中的下一个元素;
规则2:若当前指针指向的词是括号“(”,则根据与括号“(”相匹配的括号“)”之间内容来决定是调用表1中的图元4和表2中的语句8还是调用表1中的图元5和表2中的语句9;指针指向与括号“(”相匹配的括号“)”的下一个元素;
规则3:若当前指针指向的词是括号“[”,则根据与括号“[”相匹配的括号“]”之间内容来决定表1中的图元3中数组的大小和是调用表2中的语句6还是调用表2中的语句7;指针指向与括号“[”相匹配的括号“]”的下一个元素;
规则4:若当前指针指向的词是括号“)”,则根据与括号“)”相匹配的括号“(”之间符号“*”的个数来决定表1中的图元1或图元2和表2中的语句2、3、4、5的调用次数。若符号“*”的下一个词是“const”,则调用表1中的图元2和表2中的语句3或语句5,否则的话调用表1中的图元1和表2中的语句2或语句4;指针指向括号“)”的下一个元素;
规则5:若当前指针指向的词是符号“;”,则查看声明语句中未经处理过的符号“*”的个数。符号“*”的个数决定了表1中的图元1或图元2和表2中的语句2、3、4、5的调用次数。若符号“*”的下一个词是“const”,则调用表1中的图元2和表2中的语句3或语句5,否则的话调用表1中的图元1和表2中的语句2或语句4;若类型说明符中含有“const”则调用表1中的图元2和调用表2中的语句11,否则的话调用表1中的图元1和调用表2中的语句10;解析完毕。
例1:声明语句
const char*(*const variable[8])(string a,char*p);
上述语句令人难以理解,依据本文所描述的方法,自动生成的可视化表示结果(如图6)和文字描述结果:(1)variable是一个具有8个元素的数组;(2)这个数组的每个元素都是一个常量指针;(3)这些常量指针指向一个参数为(string a,char*p)的函数;(4)函数的返回值返回一个指针;(5)这个指针指向一个常量char类型。这个可视化表示图和文字描述语句详细地描述出该声明语句的语义,可帮助人们快速、准确地理解它的语义,从而提高阅读程序的效率。
Claims (2)
1.一种可视化表示和文字描述C/C++语言声明语句的方法,其特征在于:该方法包括以下步骤:
(1)将待分析的函数源代码解析为数据信息表;
(2)用树形结构表示出数据信息表的内容;
(3)图元、基本词汇与解释的关联;
定义1用于可视化表示C/C++语言声明语句的基本图形符号称为图元;
定义2用于构成描述声明语句语意的语句片段称为基本词汇;
定义3通过程序理解将一些基本词汇组合为一条声明语句的解释称为语义描述;
声明语句可视化表示图由图元组合而成,而声明语句的语义描述则需要相关语句来构成;
(4)将需要解析的声明语句的作以下预处理:
4.1将需要解析的声明语句进行标准化处理;
4.2将标准化后的声明语句进行词法分析,再将词法分析声明语句后词法标志都存储在词法表内;
4.3判断声明语法的合法性;如果声明语句不合法,则终止对这个错误的声明进行分析,并输出错误原因。
(5)查找变量在声明语句中的位置
在声明语句中,从左往右读,设定第一个满足以下条件的词为变量:
条件1:当前标识符不是类型说明符并且下一个词是符号“;”或符号“,”,符号“=”,符号“[”,符号“)”,符号“:”;
条件2:当前标识符不是类型说明符并且下一个词是符号“(”并且与符号“(”相匹配的符号“)”的下一个词是符号“;”或符号“=”,符号“:”,符号“)”;
(6)结合图元和基本词汇对声明语句进行解析
首先,利用步骤(5)查找变量的规则,找出变量在词法表中的位置,初始指针指向变量在词法表中的下一个元素,然后,依据指针指向词法表中的元素调用相应的图元和词汇,最后,当指针指向词法表的最后一个元素“;”时,调用元素相应的图元和词汇,声明语句解析结束。
2.如权利要求1所述的一种可视化表示和文字描述C/C++语言声明语句的方法,其特征在于:所述步骤(3)中,设定声明语句的可视化表示常用图元符号为表1:
表1
以及设定表2为构成描述语句的基本词汇列表;
表2
所述步骤(6)中,声明语句的解析遵守以下规则:
规则1:查找变量在词法表中的位置,在绘图板上输出变量名,并调用构成描述语句的基本词汇列表中的语句1;初始指针指向变量在词法表中的下一个元素;
规则2:若当前指针指向的词是括号“(”,则根据与括号“(”相匹配的括号“)”之间内容来决定是调用声明语句的可视化表示常用图元符号表中的图元4和构成描述语句的基本词汇列表中的语句8还是调用可视化表示常用图元符号表中的图元5和构成描述语句的基本词汇列表中的语句9;指针指向与括号“(”相匹配的括号“)”的下一个元素;
规则3:若当前指针指向的词是括号“[”,则根据与括号“[”相匹配的括号“]”之间内容来决定可视化表示常用图元符号表中的图元3中数组的大小和是调用构成描述语句的基本词汇列表中的语句6还是调用构成描述语句的基本词汇列表中的语句7;指针指向与括号“[”相匹配的括号“]”的下一个元素;
规则4:若当前指针指向的词是括号“)”,则根据与括号“)”相匹配的括号“(”之间符号“*”的个数来决定可视化表示常用图元符号表中的图元1或图元2和构成描述语句的基本词汇列表中的语句2、3、4、5的调用次数。若符号“*”的下一个词是“const”,则调用可视化表示常用图元符号表中的图元2和构成描述语句的基本词汇列表中的语句3或语句5,否则的话调用可视化表示常用图元符号表中的图元1和构成描述语句的基本词汇列表中的语句2或语句4;指针指向括号“)”的下一个元素;
规则5:若当前指针指向的词是符号“;”,则查看声明语句中未经处理过的符号“*”的个数。符号“*”的个数决定了可视化表示常用图元符号表中的图元1或图元2和构成描述语句的基本词汇列表中的语句2、3、4、5的调用次数。若符号“*”的下一个词是“const”,则调用可视化表示常用图元符号表中的图元2和构成描述语句的基本词汇列表中的语句3或语句5,否则的话调用可视化表示常用图元符号表中的图元1和构成描述语句的基本词汇列表中的语句2或语句4;若类型说明符中含有“const”则调用可视化表示常用图元符号表中的图元2和调用构成描述语句的基本词汇列表中的语句11,否则的话调用可视化表示常用图元符号表中的图元1和调用构成描述语句的基本词汇列表中的语句10;解析完毕。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN2011101726642A CN102236574A (zh) | 2011-06-24 | 2011-06-24 | 一种可视化表示和解释c/c++语言声明语句的方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN2011101726642A CN102236574A (zh) | 2011-06-24 | 2011-06-24 | 一种可视化表示和解释c/c++语言声明语句的方法 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN102236574A true CN102236574A (zh) | 2011-11-09 |
Family
ID=44887247
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN2011101726642A Pending CN102236574A (zh) | 2011-06-24 | 2011-06-24 | 一种可视化表示和解释c/c++语言声明语句的方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN102236574A (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112632891A (zh) * | 2020-11-13 | 2021-04-09 | 上海华力微电子有限公司 | Spice模型仿真系统及仿真方法 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5410701A (en) * | 1992-01-29 | 1995-04-25 | Devonrue Ltd. | System and method for analyzing programmed equations |
CN1409215A (zh) * | 2002-09-18 | 2003-04-09 | 北京航空航天大学 | 面向动态实体的分布式虚拟环境描述语言及其解释方法 |
CN101650651A (zh) * | 2009-09-17 | 2010-02-17 | 浙江大学 | 一种源代码级别程序结构的可视化方法 |
US20110055818A1 (en) * | 2009-08-26 | 2011-03-03 | Kabushiki Kaisha Toshiba | Source code analyzing system and source code analyzing method |
-
2011
- 2011-06-24 CN CN2011101726642A patent/CN102236574A/zh active Pending
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5410701A (en) * | 1992-01-29 | 1995-04-25 | Devonrue Ltd. | System and method for analyzing programmed equations |
CN1409215A (zh) * | 2002-09-18 | 2003-04-09 | 北京航空航天大学 | 面向动态实体的分布式虚拟环境描述语言及其解释方法 |
US20110055818A1 (en) * | 2009-08-26 | 2011-03-03 | Kabushiki Kaisha Toshiba | Source code analyzing system and source code analyzing method |
CN101650651A (zh) * | 2009-09-17 | 2010-02-17 | 浙江大学 | 一种源代码级别程序结构的可视化方法 |
Non-Patent Citations (3)
Title |
---|
《科技咨询导报》 20070801 林荣 等 解读C语言复杂声明 17-18 1-2 , 第22期 * |
VIKRAM A PUNATHAMBEKAR: "How to interpret complex C/C++ declaration", 《HTTP://WWW.CODEPROJECT.COM/ARTICLES/7042/HOW-TO-INTERPRET-COMPLEX-C-C-DECLARATIONS》 * |
林荣 等: "解读C语言复杂声明", 《科技咨询导报》 * |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112632891A (zh) * | 2020-11-13 | 2021-04-09 | 上海华力微电子有限公司 | Spice模型仿真系统及仿真方法 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN111177184A (zh) | 基于自然语言的结构化查询语言转换方法、及其相关设备 | |
Guerrouj et al. | Tidier: an identifier splitting approach using speech recognition techniques | |
CN102662966B (zh) | 一种面向主题的获取动态页面内容的方法及系统 | |
CN103455471B (zh) | 一种将文本解析成键值对的方法和装置 | |
CN102222004B (zh) | 交换机专用语言转换为c语言的方法 | |
CN104750663B (zh) | 页面中文本乱码的识别方法及装置 | |
CN103778200A (zh) | 一种报文信息源抽取方法及其系统 | |
CN107526968A (zh) | 一种基于语法分析的sql防注入方法和装置 | |
CN108573152A (zh) | 检测sql注入攻击的方法、装置、服务器和存储介质 | |
CN110096264A (zh) | 一种代码运行方法及装置 | |
CN107526742A (zh) | 用于处理多语言文本的方法和设备 | |
CN106021071A (zh) | 一种监控sql运行过程的方法和系统 | |
CN116521621A (zh) | 一种数据处理方法、装置、电子设备及存储介质 | |
CN103593277A (zh) | 日志处理方法及系统 | |
CN113961768A (zh) | 敏感词检测方法、装置、计算机设备和存储介质 | |
CN103902906A (zh) | 基于应用图标的移动终端恶意代码检测方法及系统 | |
CN109977430A (zh) | 一种文本翻译方法、装置及设备 | |
CN103838739A (zh) | 一种搜索引擎中纠错词的检测方法及系统 | |
CN104933030A (zh) | 一种维吾尔语拼写检查方法及装置 | |
CN102236574A (zh) | 一种可视化表示和解释c/c++语言声明语句的方法 | |
CN103440231A (zh) | 用于比较文本的设备和方法 | |
CN106033338A (zh) | 基于fog数据的源代码导入及解析的方法和装置 | |
CN114089980A (zh) | 编程处理方法、装置、解释器及非易失性存储介质 | |
CN110806896B (zh) | 基于maven扩展插件实现软件开发中国际化信息提取方法 | |
CN110781647A (zh) | 一种基于Flink实现数据格式校验的方法 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C12 | Rejection of a patent application after its publication | ||
RJ01 | Rejection of invention patent application after publication |
Application publication date: 20111109 |