我目前正在设计和实现一种小型编程语言作为我正在上课的额外学分项目.我的问题是该语言有三种数字类型:Long,Double和Fraction.分数可以用适当或不正确的分数(例如"2 1/3"或"1/2")用语言书写.这个事实导致诸如"2/3.5"(长/双)和"2/3"(长/长)等问题无法被词法分析器正确处理.我看到的最佳解决方案是更改除法运算符.到目前为止,我认为"\"是最好的解决方案,因为"//"开始评论.
如果你正在设计语言,你会选择"\"吗?
你会选择其他东西吗?如果是这样,什么?
注意:无法更改分数的分配方式.
在此先感谢您的帮助,
-编辑-
目前的运营商是:
** (功率)
* (乘)
% (模数)
+ (加)
- (减去和否定)
~ (倒数)
! (不)
> (更大)的
< (减)
>= (大于相等)
<= (较少-相等)
== (平等)
<> (不等式)
& (和)
| (要么)
^ (XOR)
?? (空coalesing)
= (分配)
注意:我的老师没有严格的约束要求; 但是,我基本上让他相信我可以将一个简单的分数计算器变成一种语言.更改分数的语法将违反分数计算器的分数语法,最好避免使用.
??C#中的运算符在评估时是否使用短路?
var result = myObject ?? ExpressionWithSideEffects();
Run Code Online (Sandbox Code Playgroud)
如果myObject为非null,ExpressionWithSideEffects()则不使用结果,但会ExpressionWithSideEffects()完全跳过?
我正在使用ANTLR(3.2)来解析一些相当简单的语法.不幸的是,我遇到了一个小问题.采取以下规则:
exp
: NUM
| '(' expression OPERATOR expression ')' -> expression+
| '(' (MINUS | '!') expression ')' -> expression
;
Run Code Online (Sandbox Code Playgroud)
OPERATOR包含与MINUS定义的相同减号(' - ').现在ANTLR似乎无法处理这两条规则.如果我删除任何一个,一切正常.
任何想法?
为什么这是真的:
(true | false & false)
Run Code Online (Sandbox Code Playgroud)
这是假的:
(true | false && false)
Run Code Online (Sandbox Code Playgroud)
在我看来应该是对方..
我决定在我的类中重载new,new [],...运算符,这样我就可以记录它们被调用的文件和行,这样我就可以更轻松地跟踪内存分配/泄漏.
现在问题出在我的堆栈和数组类(以及其他分配内存的模板容器类)中:
如果我将它们与我的一个具有new,new [],...运算符的类一起使用它可以正常工作.
但是如果我将它与标准的c ++数据类型(int,float,...)一起使用,我就无法分配它们,因为没有重载的new运算符匹配new(__ LINE __,__ FILE __)运算符的参数(或者其他人喜欢安置新的).
堆栈代码示例:
// placement new
T* t=new(__ LINE __ , __ FILE__)(&m_data[i])T;
Run Code Online (Sandbox Code Playgroud)
所以我对如何使这项工作有好主意.如果我用新的松散内存记录功能替换new(__ LINE __,__ FILE __).一种解决方案是为标准数据类型创建一个分离的堆栈,其中使用默认的new.
有没有办法在编译时检测模板参数是结构,类还是内置的c ++类型?
你怎么处理这样的东西?你有什么建议?任何关于这种设计的评论(好的,坏的)显然都是受欢迎的(只是不要张贴诸如"不要用自己的容器重新发明轮子"之类的东西).
任何人都可以向我解释这个,
String str = "Hello";
str += ((char)97) +2; // str = "Hello99";
str = str +((char)97)+2; // str = "Helloa2";
Run Code Online (Sandbox Code Playgroud)
请问+=符计算右侧第一然后将其与左侧拼接呢?
我最近偶然发现了这个表达:
True == False in (False,)
Run Code Online (Sandbox Code Playgroud)
它评估False,但我不明白为什么.
True == False是False和False in (False,)是True,所以(对我来说)两者都是合理的可能性
True == (False in (False,))
Run Code Online (Sandbox Code Playgroud)
和
(True == False) in (False,)
Run Code Online (Sandbox Code Playgroud)
True按照我的预期评估.这里出了什么问题?
我需要清除一个基本概念.这段代码工作正常.有人可以解释一下,如果函数calDouble已经返回int的地址(引用),为什么我需要在main int*j =&calDouble(i)中进一步使用&运算符; 获取int的地址(引用)?谢谢.
int& calDouble(int x)
{
x = x*2;
return x;
}
int main(int argc, char *argv[])
{
int i = 99;
int *j = &calDouble(i);
system("PAUSE");
return EXIT_SUCCESS;
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试实现自己的布尔类,但不能复制&&的本机语义.以下设计的代码演示了这个问题:
#include <iostream>>
class MyBool {
public:
bool theValue;
MyBool() {}
MyBool(bool aBool) {theValue = aBool;}
MyBool operator&& (MyBool aBool) {return theValue && aBool.theValue;}
};
bool f1() {std::cout << " First\n"; return false;}
bool f2() {std::cout << " Second\n"; return false;}
int main(int argc, char** argv) {
std::cout << "Native &&\n";
f1() && f2();
std::cout << "Overloaded &&\n";
MyBool(f1()) && MyBool(f2());
return 0;
}
Run Code Online (Sandbox Code Playgroud)
编译和运行时,结果是:
Native &&
First
Overloaded &&
Second
First
换句话说,&& on bools是懒惰的(正如任何C++程序员所期望的那样)但是重载的&&不是(正如这个C++程序员至少没想到的那样).
有没有办法让重载&&懒惰?我可以找到各种全面的延迟评估方案来提供类似Haskell的功能,但它们看起来像我的用例完全矫枉过正.
所以我有一段简单的代码打印出整数1-10:
i = 0
while i < 10:
i += 1
print(i)
Run Code Online (Sandbox Code Playgroud)
然后,如果您只是在第3行更改一个运算符,它会打印出无限量的1个整数(我明白为什么会这样做).为什么运行第二个程序时不会出现语法错误?如果赋值运算符后跟一个加法运算符,它会不会调用语法错误?
i = 0
while i < 10:
i =+ 1
print(i)
Run Code Online (Sandbox Code Playgroud) operator-keyword ×10
c++ ×3
c# ×2
python ×2
antlr ×1
binary ×1
boolean ×1
division ×1
evaluation ×1
function ×1
java ×1
logic ×1
memory ×1
memory-leaks ×1
new-operator ×1
reference ×1