我一直在考虑创建一种非常适合创建DSL的语言,允许定义中缀,后缀,前缀或甚至由多个单词组成的函数.例如,您可以按如下方式定义中缀乘法运算符(其中已定义了乘法(X,Y)):
a * b => multiply(a,b)
Run Code Online (Sandbox Code Playgroud)
或后缀"平方"运算符:
a squared => a * a
Run Code Online (Sandbox Code Playgroud)
或者是C或Java风格的三元运算符,它包含两个散布着变量的关键字:
a ? b : c => if a==true then b else c
Run Code Online (Sandbox Code Playgroud)
显然,在这种语言中存在大量的歧义空间,但如果它是静态类型的(使用类型推断),那么大多数歧义可以被消除,而剩下的那些可以被认为是语法错误(通过添加括号来纠正适当).
有什么理由我没有看到这会使这个极其困难,不可能,或者只是一个简单的坏主意?
编辑:很多人都指出了可以做到这一点或类似事情的语言,但我实际上对如何实现自己的解析器的指针感兴趣,或者如果这样做我可能会遇到的问题.
syntax parsing programming-languages infix-notation postfix-notation
我正在编写一个函数,以字符串的形式读取后缀表达式并相应地计算它.
有没有一种简单的方法可以将算术运算符的字符转换为C++中的算术运算符本身?
给定这样的输入:3+4+
算法将其转换为3 4 + +
我可以在执行后缀表达式时找到错误.但是,有可能在转换期间发现这一点吗?
(我读过的维基百科文章和网络文章不处理这种情况)
谢谢
我正在创建一个能够执行 SQL 查询的数据库。我正在使用 Flex / Bison 创建我的 AST(抽象语法树)。例如:select * from table where score> 10 * (age * pay)

当我评估这个 AST 树时,我遍历这棵树,从左边开始,然后是右边的子树。
与 muparser ( http://muparser.beltoforion.de/ ) 相比,它要快得多。有没有其他方法可以执行此处理?如果我使用 Postfix 算法 ( http://en.wikipedia.org/wiki/Reverse_Polish_notation ) 我会有更好的性能吗?
传统数据库如何执行此任务?
sql database performance abstract-syntax-tree postfix-notation
给定中缀表达式-190 + 20,正确的 RPN 结果会是什么样子?
-190 + 20 == -190 20 +?
或者..
-190 + 20 == 190 - 20 +?
一元运算符(负数)的规则是否与其他运算符相同,但只是right结合属性,并且优先级更高?
类似的表达式如下:
-(9 + 9)
将会?
-(9 + 9) = 9 - 9 +?
我正在尝试编写一个反向波兰计算器,但我不想为输入的每个算术运算符编写开关。是否可以输入算术运算符并在语言本身内部使用它?
例如,程序可以提示用户输入算术运算符 for:,
a = b [whatever operator here] c;
并且某些变量将存储该运算符。假设是+,我们得到:
a = b + c;
这是可能的还是我应该把它吸收并为操作员编写开关?
我正在测试一个中缀到后缀到中缀的转换器,并发现了一些不确定性.例如,一个简单的中缀和
1 + 2 + 3 + 4
Run Code Online (Sandbox Code Playgroud)
可以转换为后缀一个
1 2 + 3 + 4 +
Run Code Online (Sandbox Code Playgroud)
假设没有累积优先级相同的运算符.如果他们是我那么
1 2 3 4 + + +
Run Code Online (Sandbox Code Playgroud)
另一方面,所有以下后缀表达式都可以转换为初始总和
1 2 + 3 + 4 +
1 2 + 3 4 + +
1 2 3 4 + + +
Run Code Online (Sandbox Code Playgroud)
所有这些后缀表达式都是正确的吗?
如果您要制作这样的转换器,您会选择哪种形式?我需要选择一个进行测试.
algorithm infix-notation notation postfix-notation shunting-yard
连接语言具有一些非常有趣的特性,例如能够组合不同元数的函数以及能够分解出函数的任何部分。然而,许多人因为它们使用后缀表示法并且难以阅读而忽略它们。另外,波兰人可能不欣赏人们反向使用他们精心制作的符号。
那么,是否有可能有前缀符号?如果是这样,权衡是什么?
我知道它是如何工作的,但我没有使用连接语言的经验,所以我可能遗漏了一些东西。基本上,一个函数会以相反的顺序进行评估,而值会以相反的顺序从堆栈中取出。为了证明这一点,我将后缀与前缀的外观进行比较。以下是一些使用传统后缀表示法的连接表达式。
5 dup * ! Multiply 5 by itself
3 2 - ! Subtract 2 from 3
(1, 2, 3, 4, 5) [2 >] filter length ! Get the number of integers from 1 to 5
! that are greater than 2
Run Code Online (Sandbox Code Playgroud)
表达式从左到右计算:在第一个示例中,5被压入堆栈,然后dup复制堆栈顶部的值,然后将堆栈*顶部的两个值相乘。函数首先从堆栈中取出最后一个参数:在第二个示例中,当-被调用时,2位于堆栈顶部,但它是最后一个参数。
这是我认为前缀符号的样子:
* dup 5
- 3 2
length filter (1, 2, 3, 4, 5) [< 2]
Run Code Online (Sandbox Code Playgroud)
表达式从右到左计算,函数首先从堆栈中取出它们的第一个参数。请注意前缀过滤器示例如何与其描述更接近,并且看起来与应用样式相似。我注意到的一个问题是,将事情分解出来可能没有那么有用。例如,在后缀表示法中,您可以从中提取2 -出来3 2 -创建一个减法函数。在前缀表示法中,您可以从中提取 …
programming-languages postfix-notation concatenative-language factor-lang
我被困在一台锁定的电脑上工作.但我正在尝试练习我的scala.我正在使用Ideone.com,因为我甚至无法安装scalac ...
无论如何这不是编译:
class DPt(var name: String, var x: Double, var y: Double){
def print = println("DPt; name: " + name + " x: " + x + " y: " + y)
}
object Main {
def main(args: Array[String]) {
val pt0 = new DPt("Joe", 1.0, 1.0)
println("checking generated accessor: " + pt0.x)
pt0 print
pt0.x_=(3.0)
pt0 print
}
}
Run Code Online (Sandbox Code Playgroud)
我从Ideone.com scala编译器收到此消息:
Main.scala:12: error: Unit does not take parameters
pt0 print
^
one error found
spoj: The program compiled …Run Code Online (Sandbox Code Playgroud)