1

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

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

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

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

其中“表达式”产生式已经定义。

我在这里插入了一些逻辑,从我需要的令牌中构建了一个字符串。如果我们遇到一个表达式,我会评估它并将其添加到正在构建的字符串中。

atom 和 reference 类型的产品解析完美。

但是,如果我尝试解析“hello”之类的内容,则在运行 atom 规则时,生成的令牌始终是内置 Word 类型。

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

有任何想法吗?

干杯

4

1 回答 1

0

PEGKit的创建者在这里。

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

要获得您正在寻找的结果,您必须更改撇号(单引号)的tokenizerStatePKTokenizer默认情况下,这是PKQuoteState,但您需要将其更改为PKSymbolState(tokenizers-symbolState属性),以便将撇号识别为 type 的单字符标记,Symbol而不是 type 的多字符标记的开头QuotedString

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

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

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

于 2016-02-12T20:28:00.900 回答