我已经为我计划在以后的项目中使用的预处理器语言编写了tokenizer和expression评估器.我开始想我也许应该用EBNF(Extended Backus-Naur Form)来描述语言,以保持语法更易于维护,甚至用它来生成解析器的更高版本.
我的第一印象是EBNF用于标记化过程和语法验证.后来我发现它也可以用来描述运营商的优先级,就像在这篇文章或维基百科文章中一样:
expression ::= equality-expression
equality-expression ::= additive-expression ( ( '==' | '!=' ) additive-expression ) *
additive-expression ::= multiplicative-expression ( ( '+' | '-' ) multiplicative-expression ) *
multiplicative-expression ::= primary ( ( '*' | '/' ) primary ) *
primary ::= '(' expression ')' | NUMBER | VARIABLE | '-' primary
Run Code Online (Sandbox Code Playgroud)
我可以看到如何允许生成器生成内置运算符优先级的代码,但这究竟应该如何表达优先级?运算符优先级更多是关于语义还是关于语法的EBNF?如果我决定在EBNF中编写我的语言描述,我应该在考虑运算符优先级的情况下编写它还是在单独的部分中记录它?
programming-languages language-design ebnf expression-evaluation operator-precedence
我的文档product_code包含字符串值的字段,pc00XXa其中where X由一些数字1..9替换.我期待这个短语前缀查询的9个文档的结果:
{
"query": {
"match": {
"_all": {
"query": "pc001",
"type": "phrase_prefix"
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
......但结果是空的.使用product_code而不是_all,我得到预期的9个文件.
使用前缀查询而不是短语前缀查询似乎与两个_all和product_code字段一起按预期工作.以下查询给了我9个文件:
{
"query": {
"prefix": {
"_all": {
"value": "pc001"
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
Elasticsearch文档说"match_phrase_prefix与match_phrase相同,但它允许在文本的最后一个术语上进行前缀匹配".在我的情况下,我在查询中只有一个术语,所以我希望它作为前缀.
当查询包含单个术语时,短语前缀查询与前缀查询的确有何不同?为什么使用_all比明确指定字段名称更少的结果?
我有一个完全填充了在另一个程序集中实现接口的类的程序集.例如:
Main Assembly (Reference to both assemblies)
Shared Assembly
-----IModule
Class Assembly (Reference to shared assembly)
-----unknownType : IModule
-----unknownType2 : IModule
Run Code Online (Sandbox Code Playgroud)
主程序集没有直接引用类程序集中的任何类型.我正在寻找类似的类型:
// Load all referenced assemblies:
Assembly.GetExecutingAssembly().GetReferencedAssemblies()
.Except(AppDomain.CurrentDomain.GetAssemblies().Select(a => a.GetName()))
.Distinct()
.ToList()
.ForEach(act => Assembly.Load(act));
// Find all instances of IModule in loaded assemblies:
var modules = from asm in AppDomain.CurrentDomain.GetAssemblies()
from provider in asm.GetTypes()
where typeof(IModule).IsAssignableFrom(provider)
...instantiate type etc...
Run Code Online (Sandbox Code Playgroud)
如果我在类程序集中只引用了一个任意类型,那么它会显示在GetReferencedAssemblies中,被加载并正确返回 - 但是一旦我删除对该类型的引用,它就不会被转移到构建目录或显示为引用的程序集导致加载失败.
有没有办法强制VS将此程序集包含在输出目录中?主应用程序不应该知道类程序集中的任何类型.
Cluster health API具有参数wait_for_status(根据文档)等待指定的群集状态.但是,我想等待特定索引达到某种状态.
如果我使用群集运行状况请求level=indices并且index=myindex等待是否仍在群集级别上运行?我想轮询状态并在达到状态后继续会产生相同的效果但是有更好的方法吗?