我正在构建一个表达式分析器,我想从中生成数据库查询代码,我已经走得很远,但是我很难准确地解析BinaryExpressions.将它们分解为Left和Right非常容易,但我需要检测括号并相应地生成我的代码,我看不到如何执行此操作.
一个例子[请忽略有缺陷的逻辑:)]:
a => a.Line2 != "1" && (a.Line2 == "a" || a.Line2 != "b") && !a.Line1.EndsWith("a")
Run Code Online (Sandbox Code Playgroud)
我需要在中间检测'set'并保留它们的分组但是在解析期间我看不到表达式与正常BinaryExpression的任何差异(我不想检查括号的字符串表示)
任何帮助,将不胜感激.
(我应该提一下,我正在使用C#)
- 编辑 - 我没有提到我使用标准的.Net Expression类来构建表达式(System.Linq.Expressions命名空间)
--Edit2--好的我没有将文本解析为代码,我正在将代码解析为文本.所以我的Parser类有一个这样的方法:
void FilterWith<T>(Expression<Func<T, bool>> filterExpression);
Run Code Online (Sandbox Code Playgroud)
它允许你编写这样的代码:
FilterWith<Customer>(c => c.Name =="asd" && c.Surname == "qwe");
Run Code Online (Sandbox Code Playgroud)
使用标准.Net类很容易解析,我的挑战是解析这个表达式:
FilterWith<Customer>(c => c.Name == "asd" && (c.Surname == "qwe" && c.Status == 1) && !c.Disabled)
Run Code Online (Sandbox Code Playgroud)
我的挑战是将括号内的表达式保持为单个集合..Net类正确地将括号部分与其他部分分开,但由于括号而没有表明它是一个集合.
偶尔,我会用比我喜欢的更多括号编写一些代码.
if(!(new Day((((new Date()) / millisecondsPerDay) % 75)) instanceof oldDay))) {
// Bonus points if that condition made any sense to you
}
Run Code Online (Sandbox Code Playgroud)
很难跟踪我需要放多少个括号,特别是当我没有使用IDE时会立即告诉我何时出错.事实上,我敢打赌上面的例子与括号正确匹配.我已经被括号中的死亡错误所困扰,而不是我想承认.
我想知道是否有办法绕过这个.我可以使用哪些技术来避免用这么多括号包装东西?
是否有任何语言具有防止需要这么多括号的机制?例如,我想添加自动关闭括号的特殊字符和自动打开它们的特殊字符可能有所帮助.(<和>在下面的例子中)
if(!(new Day<new Date()) / millisecondsPerDay) % 75> instanceof oldDay>
Run Code Online (Sandbox Code Playgroud) 以下问题来自Vazirani等人的“动态编程”一章。等
[6.6]让我们在三个符号a上定义一个乘法运算(×);b; c根据下表:

因此,a×a = b,a×b = b等。
找到一种有效的算法,该算法检查这些符号的字符串(如bbbbac),并确定是否可以以使结果表达式的值为a的方式对字符串加上括号。例如,在输入bbbbac上,您的算法应返回yes,因为((b(bb))(ba))c = a。
这是我的方法:将其映射到此处计算布尔括号数量的问题。在该问题中,将为您提供以下形式的布尔表达式
T 或 F 和 T xor T
并且您需要找到多种方法将此方法加括号,以使其评估为true。
我们可以将或,和,xor视为遵循某些规则的运算符(T xor F = T等),并对采用值T或F的操作数进行操作。对于我们的原始问题,我们可以将a,b,c视为操作数由给定表定义的乘法(x)提供规则。
上面的方法有意义吗?还是有一个更简单的方法?
algorithm dynamic-programming boolean-expression parentheses
我有很多与此类似的公式字符串:
str <- "( (( A ) * J ) - (( J ) * G ) ) / Z "
Run Code Online (Sandbox Code Playgroud)
有许多括号不需要在那里,(A*J - J*G)/Z就足够了.R中是否有功能或包可以解决这个问题?
我尝试了R表达式的函数,as.formula但是没有找到我需要的东西.
我偶然发现了一个我没想到的编译器错误:
std::cout << sizeof(int) << std::endl; // ---> this is valid (obviously)
std::cout << sizeof((int)) << std::endl; // ---> this leads to
// "error: expected expression"
Run Code Online (Sandbox Code Playgroud)
同样,我们有:
template <typename T>
struct Foo
{
T value;
};
Foo<int> f1; // ---> this is valid (obviously)
Foo<(int)> f2; // ---> this leads to "error: expected expression"
Run Code Online (Sandbox Code Playgroud)
显然,编译器将其解释(T)为显式转换并停在那里.我理解错误,我理解编译器期待的是什么,我没有得到的是为什么(T)不能将T它视为不在上下文中(T)(exp).我认为编译器能够看透(并且可能会返回警告),所以我认为这意味着存在不明确的情况,允许那些额外的括号会导致错误.
我的问题是:什么时候会有危险?这是C++标准吗?
这是用clang 3.3测试的.和g ++ 4.7.2.
为什么嵌套括号会在此正则表达式中导致空字符串?
var str = "ab((cd))ef";
var arr = str.split(/([\)\(])/);
console.log(arr); // ["ab", "(", "", "(", "cd", ")", "", ")", "ef"]
Run Code Online (Sandbox Code Playgroud)
我想要实现的是这个
["ab", "(", "(", "cd", ")", ")", "ef"]
Run Code Online (Sandbox Code Playgroud) 
在上面的屏幕截图中,可以看出Emacs突出显示括号之间的空白,除非我将光标移动到任意一侧.
我在emacs配置中启用了smartparens,但即使我禁用它们,这个问题仍然存在.我也没有启用空白模式.
知道可能导致这种情况的原因吗?
配置的相关部分:
(require 'smartparens-config)
(smartparens-global-mode t)
(show-smartparens-global-mode t)
Run Code Online (Sandbox Code Playgroud)
谢谢.
有没有可以移动光标的快捷键
my_variable = (entry|)
Run Code Online (Sandbox Code Playgroud)
到
my_variable = (entry)
|
Run Code Online (Sandbox Code Playgroud)
在 iPython 笔记本中?其中“|” 是光标
也就是说,是否可以使用一些快捷方式来代替 iPython 中的 (右箭头) 和 (return) 来摆脱自动括号/方括号?我觉得在编码速度非常快时拥有这个会很有用。
当我有这样的字符串:
s1 = 'stuff(remove_me)'
Run Code Online (Sandbox Code Playgroud)
我可以轻松删除括号和使用中的文本
# returns 'stuff'
res1 = re.sub(r'\([^)]*\)', '', s1)
Run Code Online (Sandbox Code Playgroud)
为解释在这里.
但我有时遇到这样的嵌套表达式:
s2 = 'stuff(remove(me))'
Run Code Online (Sandbox Code Playgroud)
当我从上面运行命令时,我最终得到了
'stuff)'
Run Code Online (Sandbox Code Playgroud)
我也尝试过:
re.sub('\(.*?\)', '', s2)
Run Code Online (Sandbox Code Playgroud)
这给了我相同的输出.
如何删除外括号内的所有内容 - 包括括号本身 - 以便我最终得到'stuff'(这应该适用于任意复杂的表达式)?
我有几个 R 函数,正在 RStudio 中编写脚本。这些函数相当长。在 RStudio 中是否有键盘快捷键可以从左大括号跳到右大括号,以便我可以更有效地运行这些函数,而无需滚动脚本文件?
parentheses ×10
r ×2
regex ×2
.net ×1
algorithm ×1
brackets ×1
c# ×1
c++ ×1
curly-braces ×1
emacs ×1
formula ×1
ipython ×1
javascript ×1
python ×1
rstudio ×1
shortcut ×1
string ×1
syntax ×1
text-cursor ×1
whitespace ×1