gpt4 book ai didi

c# - 具有讽刺意味的是:如何禁止两个标记之间有空格?

转载 作者:太空狗 更新时间:2023-10-29 21:14:46 25 4
gpt4 key购买 nike

我试图在 Irony 中定义 PHP 风格的变量像这样:

variable.Rule = "$" + identifier;

效果很好,除了您可以在 $identifier 之间放置空格。我想阻止这种情况。怎么办?

我必须创建一个新的自定义终端吗?如果是这样,我还能利用 IdentifierTerminal 魔法吗?


IdentifierTerminal 中挖掘,我看到实际上有一个“NameIncludesPrefix”的标志,但它只用在一个地方。看起来前缀存储在这个 CompoundTokenDetails 对象中......我不确定如何使用。 编辑:没关系,这是一条死胡同。这些标志用于为变量的行为方式添加修饰符。


这有点管用...

class VariableTerminal : Terminal
{
public VariableTerminal(string name) : base(name)
{
}

public override IList<string> GetFirsts()
{
return new[] { "$" };
}

public override Token TryMatch(ParsingContext context, ISourceStream source)
{
if (source.PreviewChar != '$') return null;
do
{
source.PreviewPosition++;
} while (!source.EOF() && char.IsLetter(source.PreviewChar));

var token = source.CreateToken(OutputTerminal);
return token;
}
}

虽然我不太确定 OuputTerminal 是什么。我猜它是某种基于当前预览位置的动态属性?我认为 Irony 中的解析方式有点奇怪......

无论如何,问题在于当我使用此 VariableTerminal 时,而不是我之前使用 "$"+ IdentifierTerminal" 时的方式,当有语法错误,例如这段代码:

p cat

用来表示的标识符终端

Syntax error, expected: { real string $ true false ...

但是变量却给我这个错误:

Invalid character: 'c'

我认为前一个错误更有用。我真的不明白为什么它会吐出一个不同的错误...我怎样才能让它这么说呢?

最佳答案

对我来说,很明显你想要的目前不受支持(在源代码中检查)。请参阅关于 pascal character 的讨论(最底部)也被标识为“#number”,中间不允许有空格。

我认为使用非终端不是一种方式。语法本质上是工作的,你可以在标记之间有空格。所以你真正需要的是遵循 project wiki 上给出的建议。 - 页面底部的 Custom Terminals 部分并扩展 Terminal 类以满足您的需求。

或者最简单的选择是引入可以使前缀成为必需的标志。扩展 IdentifierTerminal 类并覆盖 TryMatch 方法。

如果您查看 CompoundTerminalBase 类中的这个方法,TryMatch 方法的作用基本上是:

  1. ReadPrefix(但忽略是否找到前缀)
  2. ReadBody(如果正文未被读取则失败)
  3. 读取后缀

如果找到前缀,ReadPrefix 方法会设置一个details.Prefix 标志。因此,在调用 ReadPrefix 之后,您可能需要检查新引入的强制前缀标志,如果已设置,您可以检查是否也设置了 details.Prefix 标志,否则你发出一个错误。

祝你好运:)

关于c# - 具有讽刺意味的是:如何禁止两个标记之间有空格?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5061584/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com