- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
在 Xtext/ANTLR 中处理 C++ 代码块的正确方法是什么?
我们正在为 DSL 编写一个基于 Xtext 的 eclipse 插件,它支持在明确定义的范围内添加 C++ 函数级代码(主要是 serial {/* ... */}
block ),例如像这样:
module m {
chare c {
entry void foo() {
serial {
// C++ code block
}
}
}
}
参见 here一个更全面的例子。然后将其移交给外部工具来处理进一步的编译/链接步骤,因此我们不会从 eclipse 生成任何代码。
这里的问题是如何处理这些 C++ 代码块,特别是考虑到它们可能包含自己的大括号。这与 How to include Java Code Block in Xtext DSL? 非常相似但现在我们满足于忽略该 block (即没有内容辅助或语法突出显示并不理想但可以接受。)
在我们基于 bison/flex 的工具中,这是通过在解析器和词法分析器之间共享一个变量来完成的,该变量在某些语法规则内切换“C++ 解析模式”,使词法分析器为除相关分隔符之外的所有内容返回 CPROGRAM 标记 (例如大括号。)自然翻译似乎有一个自定义的 ANTLR 词法分析器,它使用语义谓词达到相同的效果,例如
RULE_NON_BRACES: {in_braces}? ~('{' | '}')+;
作为第一个词法规则,但我找不到如何从 Xtext 语法访问该全局变量,因为似乎没有像野牛那样的“规则操作”概念。还有其他非“串行”语法上下文,其中需要 C++ 代码,因此需要在解析器和词法分析器之间进行一些协调。
最佳答案
您的问题似乎更侧重于 DSL 词法分析器如何避免迷失在 C++ 代码中。基本答案是您需要匹配括号(例如,确保它们正确嵌套)。
我不知道你是如何定义 Xtext/ANTLR 词法规则来做到这一点的;我认为有一种丑陋的方法可以进入程序代码并开始一个接一个地阅读字符。这可能会有一些并发症;您的双亲匹配逻辑可能不得不担心 C++ 代码中的各种类型的引用。例如,
{ // this } isn't a match
和
{ char x[]="} this isnt a match { either" }
其他 C++ 字符串引号可能会使这更难看清。对于像这样使用的 C++ 宏,您将如何处理?
{
#define rcb }
{ rcb
}
您可能必须制定一些关于如何在嵌入式 C++ 代码中处理 } 的特殊规则,并且您的逐字符扫描必须了解此规则。
与其让事情变得复杂,我认为你应该做的是在 C++ 中选择一个不太可能的字符序列作为你的终止符,例如,
][[
除了在字符串或注释中,我相信它不会出现在 C++ 中,或者
}}}
然后简单地使用它。根本不需要匹配 parent 。在几乎所有情况下,都不必触及要插入的 C++;在极少数情况下,它恰好包含该序列,一个微不足道的编辑(插入一个空格或换行符)修复它。现在您的词法分析器规则很简单并且可以使用您的标准词法分析器表达(我认为)。
如果你这样走,我建议你选择一个相应的开头顺序来介绍C++代码,只是为了提醒读者需要一个有趣的顺序,例如,
serial {{{ <C++code> }}}
或
serial ]][ <C++code> ][[
有了这个约定,即使是我丑陋的宏示例也很容易:
serial {{{
{
#define rcb }
{ rcb
}
}}}
PS:这个有趣的符号技巧称为“域(符号)转义”。这个问题出现在每个系统中(是的,在野外没有那么多,但我有一个 :) 允许一个人混合多个符号。根据口味,顺序因语言/系统而异。
关于c++ - 如何在 xtext DSL 中嵌入 C++ 代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35806402/
#include using namespace std; class C{ private: int value; public: C(){ value = 0;
这个问题已经有答案了: What is the difference between char a[] = ?string?; and char *p = ?string?;? (8 个回答) 已关闭
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 7 年前。 此帖子已于 8 个月
除了调试之外,是否有任何针对 c、c++ 或 c# 的测试工具,其工作原理类似于将独立函数复制粘贴到某个文本框,然后在其他文本框中输入参数? 最佳答案 也许您会考虑单元测试。我推荐你谷歌测试和谷歌模拟
我想在第二台显示器中移动一个窗口 (HWND)。问题是我尝试了很多方法,例如将分辨率加倍或输入负值,但它永远无法将窗口放在我的第二台显示器上。 关于如何在 C/C++/c# 中执行此操作的任何线索 最
我正在寻找 C/C++/C## 中不同类型 DES 的现有实现。我的运行平台是Windows XP/Vista/7。 我正在尝试编写一个 C# 程序,它将使用 DES 算法进行加密和解密。我需要一些实
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
有没有办法强制将另一个 窗口置于顶部? 不是应用程序的窗口,而是另一个已经在系统上运行的窗口。 (Windows, C/C++/C#) 最佳答案 SetWindowPos(that_window_ha
假设您可以在 C/C++ 或 Csharp 之间做出选择,并且您打算在 Windows 和 Linux 服务器上运行同一服务器的多个实例,那么构建套接字服务器应用程序的最明智选择是什么? 最佳答案 如
你们能告诉我它们之间的区别吗? 顺便问一下,有什么叫C++库或C库的吗? 最佳答案 C++ 标准库 和 C 标准库 是 C++ 和 C 标准定义的库,提供给 C++ 和 C 程序使用。那是那些词的共同
下面的测试代码,我将输出信息放在注释中。我使用的是 gcc 4.8.5 和 Centos 7.2。 #include #include class C { public:
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我的客户将使用名为 annoucement 的结构/类与客户通信。我想我会用 C++ 编写服务器。会有很多不同的类继承annoucement。我的问题是通过网络将这些类发送给客户端 我想也许我应该使用
我在 C# 中有以下函数: public Matrix ConcatDescriptors(IList> descriptors) { int cols = descriptors[0].Co
我有一个项目要编写一个函数来对某些数据执行某些操作。我可以用 C/C++ 编写代码,但我不想与雇主共享该函数的代码。相反,我只想让他有权在他自己的代码中调用该函数。是否可以?我想到了这两种方法 - 在
我使用的是编写糟糕的第 3 方 (C/C++) Api。我从托管代码(C++/CLI)中使用它。有时会出现“访问冲突错误”。这使整个应用程序崩溃。我知道我无法处理这些错误[如果指针访问非法内存位置等,
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
我有一些 C 代码,将使用 P/Invoke 从 C# 调用。我正在尝试为这个 C 函数定义一个 C# 等效项。 SomeData* DoSomething(); struct SomeData {
这个问题已经有答案了: Why are these constructs using pre and post-increment undefined behavior? (14 个回答) 已关闭 6
我是一名优秀的程序员,十分优秀!