gpt4 book ai didi

c++ - "simple"C++ 解析器

转载 作者:太空宇宙 更新时间:2023-11-04 12:05:22 25 4
gpt4 key购买 nike

我有一个项目 (SCC),有点像 C++ 的 REPL。在布什提示我可以做

scc '2+2'

或者更复杂一点:

scc  'double x = 0.5;  sin(x)'

相当于:

scc  'double x = 0.5;  cout << sin(x) << endl;'

如果最后一个(也是唯一可能的)语句表达式没有以分号结束,它被发送到 std::cout。我的问题是关于从 C++ 代码片段中解析出最后一条语句。我很清楚 C++ 解析有多么困难。通过仅查找最后一个 ';' 来使用简单的 sed 脚本解析最后一个语句,最初对我来说已经足够好了。但现在项目比小型个人项目大,我需要更好的解析器。

下面是我当前的 SED 解析器的迷你单元测试。您可以看到我用来进行解析的 SED 正则表达式:

    cat  <<EOF  | sed    's/$//;s/[ \t]*$//;s/\(.*[;}]\)*\([^;}]\+$\)/\0    ==>>  \1   PRINT(\2);/'


print
no-print;
OK; print
OK; no-print;
OK; no-print; print
FAIL; while(a){b;} no-print
FAIL; while(a) no-print
OK; for(a;b;c) {no-print}
FAIL; for(a;b;c) no-print
OK; {}
OK; {no-print-code-block;}
FAIL; print_rvalue_t{1}
FAIL; f(int{1})
FAIL; f(";")
FAIL; f(';')
FAIL; f("}")
EOF

cat 之后的第一行是空行。第二行是一个空格行。第三 - 声明未以 ';' 终止 - 应该打印。第 4 - 2 语句片段。等等。如果存在 FAIL - 解析器将在此行失败。输出看起来像这样:

    print   ==>>     PRINT(print);
no-print;
OK; print ==>> OK; PRINT( print);
OK; no-print;
OK; no-print; print ==>> OK; no-print; PRINT( print);
FAIL; while(a){b;} print ==>> OK; while(a){b;} PRINT( no-print);
FAIL; while(a) no-print ==>> FAIL; PRINT( while(a) no-print);
OK; for(a;b;c) {no-print}
FAIL; for(a;b;c) no-print ==>> FAIL; for(a;b; PRINT(c) no-print);
OK; {}
OK; {no-print-code-block;}
FAIL; print_rvalue_t{1}
FAIL; f(int{1}) ==>> FAIL; f(int{1} PRINT());
FAIL; f(";") ==>> FAIL; f("; PRINT("));
FAIL; f(';') ==>> FAIL; f('; PRINT('));
FAIL; f("}") ==>> FAIL; f("} PRINT("));

没有 ==>> 标记的行是未经修改就通过解析器的行。标记转换后的片段,其中最后一条语句包装在 PRINT( ) 中。如您所见,当前的 SED 解析器不是很好。

所以我正在寻找更好的东西。我会接受答案,即使不是解析时 100% 正确。更好的 SED 脚本对我来说已经足够好了。正确的方法可能是使用真正的解析器(来自类似CLANG),但我有点担心这项工作的复杂性。

我尝试在 boost/xpressive 中编写解析器 - http://github.com/lvv/scc/blob/master/sccpp.h .因为它不是真正的 C++解析器。这只是为了一件事而做的快速破解:解析最后一条语句。这是能够进行上述所有单元测试。但不幸的是,对于更长的片段慢得无法忍受。

问题是:如何做一个更好的解析器?

最佳答案

Right way to do it would be probably to use real parser (from something like CLANG) but I am a little bit apprehensive of complexity of this endeavor

不是。一个简单的事实是 C++ 就像 HTML - 你需要一个真正的库来做它,所以除非你想花数年时间开发自己的,否则几乎唯一的方法就是使用现有的 C++ 解析器。 Clang 是这方面唯一的选择。因此,无论您觉得它有多复杂,您别无选择。

关于c++ - "simple"C++ 解析器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12398943/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com