- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我需要获取功能 block (定义和所有内容,而不仅仅是声明),以便获取功能依赖图。从函数依赖关系图中,识别连接的组件并模块化我庞大的 C 代码库,一次一个文件。
问题:我需要一个 C 解析器来识别功能 block ,仅此而已。我们有自定义类型等,但签名是
storage_class return_type function_name ( comma separated type value pairs )
{
//some content I view as generic stuff
}
我提出的解决方案:显然,像任何理智的人一样使用 sly 和 pycparser。
pycparser 的问题:需要从其他文件编译预处理器,只是为了识别代码块。在我的例子中,事情达到了 6 个级别的深度。抱歉,我无法显示实际代码。
尝试使用 Sly 编写代码:
from sly import Lexer, Parser
import re
def comment_remover(text):
def replacer(match):
s = match.group(0)
if s.startswith('/'):
return " " # note: a space and not an empty string
else:
return s
pattern = re.compile(
r'//.*?$|/\*.*?\*/|\'(?:\\.|[^\\\'])*\'|"(?:\\.|[^\\"])*"',
re.DOTALL | re.MULTILINE
)
return re.sub(pattern, replacer, text)
class CLexer(Lexer):
ignore = ' \t\n'
tokens = {LEXEME, PREPROP, FUNC_DECL,FUNC_DEF,LBRACE,RBRACE, SYMBOL}
literals = {'(', ')',',','\n','<','>','-',';','&','*','=','!'}
LBRACE = r'\{'
RBRACE = r'\}'
FUNC_DECL = r'[a-z]+[ \n\t]+[a-zA-Z_0-9]+[ \n\t]+[a-zA-Z_0-9]+[ \n\t]*\([a-zA-Z_\* \,\t\n]+\)[ ]*\;'
FUNC_DEF = r'[a-zA-Z_0-9]+[ \n\t]+[a-zA-Z_0-9]+[ \n\t]*\([a-zA-Z_\* \,\t\n]+\)'
PREPROP = r'#[a-zA-Z_][a-zA-Z0-9_\" .\<\>\/\(\)\-\+]*'
LEXEME = r'[a-zA-Z0-9]+'
SYMBOL = r'[-!$%^&*\(\)_+|~=`\[\]\:\"\;\'\<\>\?\,\.\/]'
def __init__(self):
self.nesting_level = 0
self.lineno = 0
@_(r'\n+')
def newline(self, t):
self.lineno += t.value.count('\n')
@_(r'[-!$%^&*\(\)_+|~=`\[\]\:\"\;\'\<\>\?\,\.\/]')
def symbol(self,t):
t.type = 'symbol'
return t
def error(self, t):
print("Illegal character '%s'" % t.value[0])
self.index += 1
class CParser(Parser):
# Get the token list from the lexer (required)
tokens = CLexer.tokens
@_('PREPROP')
def expr(self,p):
return p.PREPROP
@_('FUNC_DECL')
def expr(self,p):
return p.FUNC_DECL
@_('func')
def expr(self,p):
return p.func
# Grammar rules and actions
@_('FUNC_DEF LBRACE stmt RBRACE')
def func(self, p):
return p.func_def + p.lbrace + p.stmt + p.rbrace
@_('LEXEME stmt')
def stmt(self, p):
return p.LEXEME
@_('SYMBOL stmt')
def stmt(self, p):
return p.SYMBOL
@_('empty')
def stmt(self, p):
return p.empty
@_('')
def empty(self, p):
pass
with open('inputfile.c') as f:
data = "".join(f.readlines())
data = comment_remover(data)
lexer = CLexer()
parser = CParser()
while True:
try:
result = parser.parse(lexer.tokenize(data))
print(result)
except EOFError:
break
错误:
None
None
None
.
.
.
.
None
None
yacc: Syntax error at line 1, token=PREPROP
yacc: Syntax error at line 1, token=LBRACE
yacc: Syntax error at line 1, token=PREPROP
yacc: Syntax error at line 1, token=LBRACE
yacc: Syntax error at line 1, token=PREPROP
.
.
.
.
.
输入:
#include <mycustomheader1.h> //defines type T1
#include <somedir/mycustomheader2.h> //defines type T2
#include <someotherdir/somefile.c>
MACRO_THINGY_DEFINED_IN_SOMEFILE(M1,M2)
static T1 function_name_thats_way_too_long_than_usual(int *a, float* b, T2* c)
{
//some code I don't even care about at this point
}
extern T2 function_name_thats_way_too_long_than_usual(int *a, char* b, T1* c)
{
//some code I don't even care about at this point
}
期望的输出:
function1 :
static T1 function_name_thats_way_too_long_than_usual(int *a, float* b, T2* c)
{
//some code I don't even care about at this point
}
function2 :
extern T2 function_name_thats_way_too_long_than_usual(int *a, char* b, T1* c)
{
//some code I don't even care about at this point
}
最佳答案
pycparser 有一个 func_defs示例来完全满足您的需求,但 IIUC 您在预处理方面遇到问题?
This post详细描述了为什么 pycparser 需要预处理文件,以及如何设置它。如果您控制构建系统,那实际上非常容易。预处理文件后,上面提到的示例应该可以工作。
我还会注意到,由于函数指针的存在,静态查找函数依赖关系并不是一个简单的问题。您也无法对单个文件准确地执行此操作 - 这需要多文件分析。
关于python - 如何使用 sly 只获取功能 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57208950/
以下之间有什么区别:data-sly-use、data-sly-resource、data-sly-include 和 数据-sly-模板?我正在阅读 Sightly AEM 上的文档,我非常困惑。
我是新来的。有人可以帮我了解使用之间的区别吗 和 我在AEM html中使用它。使用div标签作为条件语句是否会对结构产生影响? 最佳答案 当 data-sly-test 中的表达式评估为true
在 AEM 6.1 中,结构如下: - Page - form node - parsys - node 1 - node 2 - ...
所以我正在构建一个多字段创作选项。如果需要,发布者可以添加值并创建更多文本字段。但问题是添加 内的标签标签给我带来了问题。例如: { "@context": "https://sc
使用http://darsa.in/sly/ 为什么这段代码不能让 Sly 工作?抱歉,这是我第一次。我查看了文档并按照它操作,但它不起作用。是不是少了点什么?我是 darsain Sly 的新人。请
关闭。这个问题是opinion-based .它目前不接受答案。 想改善这个问题吗?更新问题,以便可以通过 editing this post 用事实和引文回答问题. 2年前关闭。 Improve t
我正在尝试使用 http://darsa.in/sly/examples/horizontal.html一页上有多个“按项目循环”轮播。 我的html:
我在使用 Sly 滚动条时遇到问题。 我想设置一个时间线,我可以在其中通过使用鼠标和滚动条拖动来滚动。用鼠标滚动效果很好,但我无法让滚动条工作,而且没有适当的文档。 控制台也没有错误。 这是我的滚动条
有下一个fiddle使用 JQuery 插件。接下来的情况:如果您单击一个元素,它会向左移动。如何使该元素在不点击的情况下自行移动? var sly = new Sly($('.frame.left'
我是 CUDA 编程的新手,我正在处理一个需要在一台机器上使用多个 GPU 的问题。我知道为了更好的图形编程需要通过 SLI 组合多个 GPU。但是,对于 CUDA 编程,我是否还需要通过 SLI 组
我使用 Darsain/Sly ( Github ) 构建了一个产品 slider 。它工作得非常好,但没有进行无限循环的功能。在 Github 上,我发现了同样的报告问题。 有人使用过这个库并且知道
我见过 HTL data-sly-use 的不同用法 我是这样看的: 而且我看到它是这样自动关闭的: 为什么要使用每种方式,最好的使用方式是什么? 最佳答案 我认为对于使用它的方式没有任何
我想使用狡猾的 slider 。我正在尝试特别使用水平 slider 。 slider 的链接为 here . 我正在尝试使用强制居中 slider 。但无法从文档或其他任何地方获得任何帮助。如果有人
我需要获取功能 block (定义和所有内容,而不仅仅是声明),以便获取功能依赖图。从函数依赖关系图中,识别连接的组件并模块化我庞大的 C 代码库,一次一个文件。 问题:我需要一个 C 解析器来识别功
我目前有一个 data-sly-list,它填充一个 JS 数组,如下所示: var infoWindowContent = [
我正在尝试利用Sly Scroller用于水平滚动。我尝试阅读和理解文档,但我只是不明白如何使用它。 任何人都可以帮助我开始使用比阅读文档更简单的示例,甚至指定任何 jsfiddle 实现或有关该主题
我正面临一个一整天都无法解决的问题。到了晚上,我不明白是什么导致了这个问题。现在,我知道是什么原因造成的,但我不知道为什么会导致这个问题。 首先,我正在开发基于 materialize.css 作为前
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 5 年前。 Improve this qu
我正在研究 DX11 计算着色器。而且我想知道再添加一张具有 Crossfire/SLI 的显卡是否会提高性能。或者在不使用 Crossfire/SLI 的情况下再添加一张显卡。 有没有人试验过这个?
我有一段 Sightly/HTL 代码如下 - × Tooltip ${properties.tooltip_te
我是一名优秀的程序员,十分优秀!