rust - 使用 PEST 解析器的 PEG 语法的歧义
问题描述
我正在尝试为具有大约 100 个关键字的旧文件格式编写 PEG,这些关键字不能用作标识符。
以下是关键字规则的示例:
IN = { ^"in" } // Caret means case insensitivity
keyword = { IN } // plus others
标识符规则如下所示:
identifier = @{ ( "_" | ASCII_ALPHA ) ~ ASCII_ALPHANUMERIC* }
目前,此标识符规则将匹配所有关键字。所以标识符规则变为:
identifier = @{ !keyword ~ ( "_" | ASCII_ALPHA ) ~ ASCII_ALPHANUMERIC* }
这种方法有效,除非标识符以与关键字相同的字母开头。例如,标识符inner
被视为in
后跟文本的关键字。
如何允许以关键字开头的标识符?请注意,在 PEST 解析器生成器中,终端只能指定为字符串,而不是正则表达式。
解决方案
keyword
您可以使用谓词强制只匹配完整的单词。例如:
identifier_start = _{ "_" | ASCII_ALPHA }
identifier_continue = _{ "_" | ASCII_ALPHANUMERIC }
keyword = @{ (^"for" | ^"in") ~ !identifier_continue }
identifier = @{ !keyword ~ identifier_start ~ identifier_continue* ~ !identifier_continue }
这将匹配for
and in
,但不匹配form
or int
。
推荐阅读
- python - 从 Python 调用 Azure 逻辑应用终结点的最佳方式是什么?
- email - 将 Gmail“来自:mailer-damon”和“来自:postmaster”的电子邮件数据拉入谷歌表格?
- java - 即使 db 对象存在,JPARepository 的 findbyid 也会返回 null (Hibernate)
- wai-aria - 实施 Aria 1.1
- google-cloud-platform - 如何使用 Cloud Composer 在 Compute Engine 虚拟机上安排 Jupyter Notebooks?
- java - java.lang.RuntimeException:无法创建类 com.example.architectureexample.NoteViewModel 的实例
- sql - 在 postgresql 的单个函数中运行超过 1 个函数的问题
- c++ - C++:当使用一个cin语句输入多个值时,有没有办法检查每个值是否单独失败?
- c - 无论缓冲区大小如何,都无法访问 $eip - gdb
- fetch - SwiftUI @fetchrequest 没有更新我的视图