- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我试图在 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
方法的作用基本上是:
如果找到前缀,ReadPrefix
方法会设置一个details.Prefix
标志。因此,在调用 ReadPrefix
之后,您可能需要检查新引入的强制前缀标志,如果已设置,您可以检查是否也设置了 details.Prefix
标志,否则你发出一个错误。
祝你好运:)
关于c# - 具有讽刺意味的是:如何禁止两个标记之间有空格?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5061584/
我正在尝试使用 npmpublish 命令发布包。但我每次都会收到此错误。 npm ERR! code E403 npm ERR! 403 Forbidden - PUT https://regist
我在 WAMP 上访问我的本地主机(最后是 phpmyadmin)时遇到问题。 当我输入 localhost或 http://127.0.0.1进入我的浏览器,我收到以下消息: Forbidden Y
我正在尝试发送 $ajax,并且我已经得到了它,但是我必须使用我的表单发送文件,无论是否相同,都没关系。尚未找到 csrf token ,并且出现错误。 我的 JavaScript $(doc
我有一个奇怪的问题,我试图使用请求模块废弃某些页面,但这样做时我收到 403 访问被拒绝。但我完全能够使用 Node 的curl 模块来完成此操作。但互联网上的人们认为,它比请求模块更需要性能,因为我
所以,我正在制作一个公共(public)的不和谐机器人,但我的脚本的一部分有问题。我的 kick/ban 命令是用来完成的 $ban @user 它必须在 ping 中完成。由于这是公开的,我真的很想
我在负载均衡器后面有 2 个服务器。此 LB 上配置了 SSL。将近 50 个不同的客户端能够成功连接到我的网站,除了 1 个客户端从浏览器收到禁止 (403) 消息。 经过一番调查,我发现他在代理服
1、禁止计算局部梯度 torch.autogard.no_grad: 禁用梯度计算的上下文管理器。 当确定不会调用Tensor.backward()计算梯度时,设置禁止计算梯度会减少内存消耗。
如果 Moose 的构造函数调用中有额外的参数不是属性,有没有办法死?例如,这个: package Shoe; use Moose; has 'size' => (is => 'ro', isa =
在服务器上,安装了 Nginx。 Let's Encrypt 在 www.domain.com 上运行良好,但不适用于 static.domain.com 使用 PuTTY,当我输入时:sudo le
我使用 emacs 来编辑所有内容。在我的一些 LateX 文档中,我想在编辑表格和代码时自动禁用自动填充模式。基本上,我想要两个标签,例如: %%% BEGIN NO FILL %%%
通过 Nuget,我将 WindowsAzure.Storage 升级到 8.1.1。 然后,我下载了 AzureStorageEmulator 5.1.0.0 客户端。 我的连接字符串: UseDe
Qt documentation说,信号的返回值是不可能的: Signals are automatically generated by the moc and must not be implem
编辑版本 我有一个关于 GPG 的问题,但我写了所有的过程,也许它会对某人有所帮助。 我想:禁止 GPG 命令中的密码提示。 我不想:使用 -c 选项(--对称)。 我有 2 个系统 Linux 和
现在的想法是这样的:在 Java 中为 octalIntegerLiteral我有一个规则 octalNumeral, (integerTypeSuffix optional) 但我想得到一个数字作为
我在 Python 项目中所有模块的开头使用以下内容: import setup_loggers setup_loggers是一个可以做到这一点的模块。 import语句确保无论首先加载哪个模块,记录
我刚刚下载了最新版本的 XAMPP,PHP 版本为 7.2.4。我为 HTML 表单做了一个非常简单的 PHP 验证,当我按下提交时,它会出现以下内容: Access forbidden!You do
我已经成功运行 Vagrant 大约一个星期了。昨晚我运行了 vagrant reload,现在我无法再访问我的网站。 VirtualBox 版本 4.2.16 Vagrant 版本 1.2.7 我的
我使用以下 JavaScript 代码在完成 ajax 后播放音频: $(document).ready(function () { $.ajaxSetup(
我有一个似乎可以在互联网上运行的应用程序。但我接到了一位最终用户的电话,他在使用website时遇到困难。 我要求她发送控制台错误的屏幕截图并收到以下信息: 从 stackoverflow 搜索来看,
我在尝试提交到 svn 存储库时遇到此错误: svn: MKACTIVITY of '/svn/Demo/!svn/act/e2e65cfa-...4165f': 403 Forbidden (htt
我是一名优秀的程序员,十分优秀!