PegKit 字符串插值

PegKit string interpolation

我正在使用 PegKit 构建一个简单的领域特定解释语言。

除了内插字符串,我基本上可以正常工作。

我们的想法是实现这样的某种规则:

atom = Number | stringLiteral | referenceType;
stringLiteral = "'"! (~"'" | "{"! expression "}"!)*  "'"!;
referenceType = Word ('.' Word)*;

已经定义了 'expression' 生产。

我在此处插入了一些逻辑,用于根据我需要的标记构建一个字符串。如果我们遇到一个表达式,我会对其求值并将其添加到正在构建的字符串中。

原子和引用类型产生式解析完美。

但是如果我尝试解析像 'hello' 这样的东西,当原子规则是 运行 时,生成的标记总是内置的 Word 类型。

我尝试用美元符号和其他字符组合替换单引号来表示字符串的开头和结尾,但它始终不匹配。

有什么想法吗?

干杯

这里是 PEGKit 的创建者。

您确定生成的错误 'hello' 令牌是 Word 类型吗?我怀疑它们实际上可能是 QuotedString 类型……PKTokenizer 的默认行为是为任何单引号或双引号字符串生成一个 QuotedString 标记。

要获得您正在寻找的结果,您必须更改 PKTokenizertokenizerState 中的撇号(单引号)。默认情况下,这是 PKQuoteState,但您需要将其更改为 PKSymbolState(标记器 -symbolState 属性),以便撇号被识别为类型的单字符标记Symbol 而不是 QuotedString.

类型的多字符标记的开头

您可以在语法顶部的 Action 中执行此操作(或在配置分词器的任何位置):

@before {
    PKTokenizer t = self.tokenizer;
    [t setTokenizerState:t.symbolState from:'\'' to:'\''];
}

现在撇号将被标记为单字符 Symbol 个标记。