C++提升::精神解析嵌入式语言
C++ boost::spirit parsing embedded languages
我的问题其实很简单。我目前正在研究一种语言解析器,它可以解析带有嵌入式DSL的元语言。这对我来说很有趣,因为它可以使用HTML和嵌入式JavaScript/CSS解析网站。我想为特定用例设计一些具有最少DSL的类似系统。
boost::spirit有能力做类似的事情吗?我只是不知道boost::spirit如何处理词法分析器生成,或者它是否是一个无扫描仪的解析器。
提前感谢!
灵
气可以与扫描仪(Spirit Lex(一起使用,也可以不使用。
不过,以我的拙见,Spirit在不使用扫描仪的情况下会发光。究其原因,主要是当你避免复杂性时,精神会发光,而使用精神力就像是你灵气语法定义的复杂性倍增器。
那不碍事,
- 是的,您可以切换到不同的嵌入式语法¹。纳比亚莱克技巧实际上是实现这种切换的著名方法。
- 从技术上讲,在使用 Spirit Lex 时也可以切换词法分析器状态以实现相同的切换,但您必须牢记此方法的限制(根据解析器层中的条件无法操作词法分析器状态,这可能与该区域中存在未记录的解析器指令所暗示的事情相反(
- 你的问题似乎没有谈论临时/即时语法,但由于"DSL"建议这一点,我将添加适当的警告:Spirit Qi是一个解析器生成器框架,在编译时生成PEG解析器。在它目前的版本中,它不适合在运行时生成规则/语法(主要是由于它下面的 Boost Proto/Boost Phoenix 的限制(。Spirit X3可能会消除许多这些限制,但那是未来。
也就是说,我强烈建议为此目的查看现成的解析器/分词器。我的立场通常概括为:使用Spirit进行快速开发和临时解析。
一旦你的语法变得足够复杂,并且你知道语法是固定的/稳定的,我相信你可以用手写解析器或使用更乏味的解析器生成器之一,如ANTLR,CoCo/R,Flex/bison等,这需要更多的设置成本。
¹ 旁注:我不认为"DSL"是HTML中脚本的合适术语。"嵌入式"性质只是切线相关,例如 ECMAScript 几乎不是"特定于域的",所以我在这里坚持"嵌入式语法">
相关文章:
- 在提升multi_index容器中,是否定义了"default index"?
- 提升 ASIO 无法识别计时器对象
- 提升精神:解析布尔表达式并简化为规范范式
- 如何克服提升精神AST混乱
- 不同语言中相同代码的不同行为
- 缓慢提升ASIO
- 我可以把基础班提升为儿童班吗
- 为什么C++对链表中的下一个节点使用指针,而像 C# 或 Java 这样的语言只使用类 Node 的名称?
- r语言 - C++ 类型为"const std ::?
- 通用C++/Python 多语言的存在
- 提升反序列化对象具有 nan 或 -nan 值
- 为什么开发人员将C / C ++用于嵌入式系统,而不是像Python这样的高级语言与C相比?
- 当使用Lua作为嵌入式语言(比如c++)时,有什么简单/方便的方法可以找到变量在Lua中的定义位置吗
- 将提升 (ASIO) 错误消息转换为自然语言
- C++提升::精神解析嵌入式语言
- 提升精神解析目标C类语言
- c语言中的类型提升和转换
- 嵌入式脚本语言与C/ c++ API多线程环境
- C++中用于嵌入式DSL语言的C++运算符重载
- 为C++选择嵌入式脚本语言