是否可以使用为一种语言开发的 FsYacc 解析器作为其他语言解析过程的一部分?
我正在为两种语言 L1 和 L2 实现解析和表达式求值。 重要的是,L1 可以用作单独的语言,也可以用作 L2 的一部分,并且 L2 只包含几个关键字,而 L1 中不存在这些关键字。
我已经完成了 Lexin ->解析-> AST 生产-> L1 的 AST 处理过程,并通过 FsLex、FsYacc 实用程序用于此 F#。
在解析另一种语言 L2 期间是否可以使用已经开发的解析过程(我的意思是 L1 解析器中定义的标记、AST 生成)?
AST:L1的AST将作为L2的AST的一部分,并且将使用相同的AST处理过程。
FsLex Lexer:可能对于两种语言来说都是常见的,我只需要在 L1 词法分析器中包含几个缺少的 L2 关键字。但是如果可以为 L1 和 L2 提供单独的词法分析器,并从 L2 词法分析器引用 L1,那就太好了。
FsYacc 解析器:我不喜欢 'copy -C' 将所有 L1 解析器代码编码到 L2 中。 是否有一种方法可以引用我在 L1 解析器中定义的 L2、令牌和 AST 数据生成?
提前致谢
I'm implementing parsing and expression evaluation for two languages L1 and L2.
Important thing is that L1 can be used as separate language or as a part of L2, and L2 contains only several keywords, which are absent in L1.
I've done already Lexing -> Parsing -> AST production -> AST processing process for L1 and used for this F# with FsLex, FsYacc utilities.
Is it possible to use already developed parsing process (I mean tokens, AST production defined in L1 parser) during parsing another language L2?
AST: AST of the L1 will be used as part of AST for L2, and it will be used the same AST processing process.
FsLex Lexer: possible will be common for both languages, and I will need just include into L1 lexer also several absent keywords for L2. But if it is possible to have separate lexers for L1 and L2, and refer to L1 from L2 lexer, it will be excellent.
FsYacc Parser: I would not like 'copy-C' all L1 parsers code into the L2.
Is there is a way to reference in my L2, tokens and AST data production defined in L1 parser?
Thanks in advance
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
这是一篇有趣的文章,其中提到了语法写作的困难。简而言之,您无法使用类似 yacc 的解析器生成器做您想做的事情。这并不意味着您无法使用某些基于宏的系统来实现代码重用,但它仍然是一个黑客。
Here is an interesting article which mentions the difficulties of grammar composition. The short-story is that you can't do what you want to do using yacc-like parser generators. That does not mean you can't achieve code reuse using some macro-based system, but it will remain a hack.