PEST解析器中PEG语法的歧义问题

4

我想为一个旧的文件格式编写 PEG(Parsing Expression Grammar),其中大约有100个关键字不能用作标识符。

下面是一个关键字规则的例子:

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 定义为 { IN &space } 吗? - Jmb
1个回答

4

您可以使用谓词来强制关键字只匹配完整单词。例如:

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

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

这将匹配forin,但不匹配formint


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接