gpt4 book ai didi

c++ - 如何在 xtext DSL 中嵌入 C++ 代码?

转载 作者:太空狗 更新时间:2023-10-29 20:55:23 25 4
gpt4 key购买 nike

在 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/

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