gpt4 book ai didi

c++ - 从专有格式到 C++ 类

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

给定这样的输入(用户定义的格式):

type dog<
int years
char[] name
>

如何生成 2 个或更多这样的不同文件:

file1.c
------------
struct dog{
int years
char name
}

file2.cpp
-------------
class dog{
int years
string name
%get and set methods
}

像 flex 和 bison 这样的解析器生成器是最好的方法吗?或者有更好的方法吗?

最佳答案

这完全取决于您的语言的复杂性和您打算进行的转换。

选项 1:手工制作的临时处理

如果您的转换很简单,并且主要是将一些标记从源语言转换为目标语言(例如,“type”转换为“struct”,“<>”转换为“{}”),您可以考虑手工制作使用字符串操作或 regexes 进行解析使用 std::regex .

但这还不够:您必须在源语言中识别语句以生成半列分隔的 c 和 c++ 语句。此外,您必须将 [] 与正确的元素相关联。此外,要生成正确的 getter/setter,您的代码必须理解语句内容。

所以是的,在这里你需要一个词法分析器和一个解析器。

选项 2:手工制作的解析器

对于“简单”语言,您可以轻松制作 a recursive descent parser . “简单”是什么意思?这意味着可以用 LL(1) 语法描述的语言。现在无需过多地了解编译器理论,它或多或少是一种语言,其中前面的一个标记唯一地确定了您拥有的语法结构。

请注意,您有一个使用 Bjarne Stroustrup 的“C++ 编程语言”以这种方式设计的非常简单的计算器示例。

选项 3:使用编译器生成器

虽然词法扫描器和递归下降解析器相对容易编写代码,但它仍然以某种方式重新发明轮子。对于不符合 LL(1) 标准的语言,您别无选择,只能使用编译器生成器。

那么 Flex/bison 是一个非常合理且得到广泛支持的选择。但是你必须熟悉它的逻辑、语法文件和代码模板。这不是你可以在几个小时内掌握的东西。

如果您必须专业地支持一种自定义语言,那确实值得投资。如果它是一个小项目,学习曲线可能会对你不利。

选项 4:轻量级提升替代方案

另一种更轻便的方法是使用 boost spirit ,它基于c++,更容易学习:你直接用C++表达语法规则。主要成分太多:Lex用于词汇扫描仪和Qi对于解析器。

对于中小型解析器(如数据定义语言)来说没问题,但它有 some serious limitations如果你有完整的语言。顺便说一句,据我所知,它仅限于 LL(k) 语法。

关于c++ - 从专有格式到 C++ 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38099546/

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