首页 > 解决方案 > 使用 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 解析器生成器中,终端只能指定为字符串,而不是正则表达式。

标签: rustpeg

解决方案


keyword您可以使用谓词强制只匹配完整的单词。例如:

identifier_start = _{ "_" | ASCII_ALPHA }
identifier_continue = _{ "_" | ASCII_ALPHANUMERIC }

keyword = @{ (^"for" | ^"in") ~ !identifier_continue }
identifier = @{ !keyword ~ identifier_start ~ identifier_continue* ~ !identifier_continue }

这将匹配forand in,但不匹配formor int


推荐阅读