我今天开始使用ANTLR,并且我已经创建了一个基本的解析器.
解析后,我最终得到了一棵树.对我来说,似乎这只是String在一组树形结构中放在一起的Tree-nodes.这对我来说不是很有用.我想要一个对象图.
澄清(这是一个例子,而不是我真正的应用程序):因为"5-1+6"我似乎最终得到:
new String("PLUS")
new String("MINUS")
new String("5")
new String("1")
new String("6")
Run Code Online (Sandbox Code Playgroud)
我会发现更有用的东西:
new Plus(
new Minus(
new IntegerLiteral(5),
new IntegerLiteral(1)),
new IntegerLiteral(6))
Run Code Online (Sandbox Code Playgroud)
从第一个表示到另一个表示最方便的方法是什么?在本文中,作者做了类似的事情:
public Expression createExpr(CommonTree ast) {
// ...
switch (ast.getType()) {
case SimpleExpressionParser.INT:
return new IntegerLiteral(ast.getText())
case SimpleExpressionParser.PLUS:
return new Plus(createExpr((CommonTree)ast.getChild(0)), // recurse
createExpr((CommonTree)ast.getChild(1))); // recurse
case SimpleExpressionParser.MINUS:
return new Minus(createExpr((CommonTree)ast.getChild(0)), // recurse
createExpr((CommonTree)ast.getChild(1))); // recurse
}
// ...
}
Run Code Online (Sandbox Code Playgroud)
这是首选方式吗?!我不能指示ANTLR以某种方式生成这个样板代码(它会是巨大的)吗?
可能相关的问题:
这是在Java 6上
我可以有一个通用的方法来处理我的异常 - 所以不要在每个方法中执行n次
try {
// Do something
} catch (XException e) {
// Do something
} catch (YException e) {
// Do something
} catch (ZException e) {
// Do something
}
Run Code Online (Sandbox Code Playgroud)
我有
try {
// Do something
} catch (Exception e) {
handleAll (e);
}
Run Code Online (Sandbox Code Playgroud)
和方法handleAll(e)呢
if e.instanceOf(XException)
else if e.instanceOf(YException)
else if e.instanceOf(ZException)
Run Code Online (Sandbox Code Playgroud)
第二种方法有什么问题吗?
更新:
我最初的问题是关于"集中处理"在一个地方对于检查和运行时异常.答案指出我应该避免使用instanceof().
@ aioobe的想法看起来很整洁.对这种方法有任何负面意见吗?
当父类有一个add带有2个参数的方法时,如果我们add在子类中添加带有3个参数的新方法,我们应该将其称为过载吗?
提前致谢.
我对类中的方法创建有疑问,用于设置信息.
创建用于设置每个属性的单独方法
class Address{
private String name;
private String city;
public setName(String name) { ... }
public setCity(String name) { ... }
}
Run Code Online (Sandbox Code Playgroud)创建用于设置所有属性的单一方法
class Address{
private String name;
private String city;
public setAddress(String name,String city) { ... }
}
Run Code Online (Sandbox Code Playgroud)从以上两种方式来看,在记忆的观点上更可取?
我需要获取有关机器上运行的某些进程(而不是Java进程)的内存和CPU使用情况的信息.
我怎样才能做到这一点?
[我在关闭之后重新打开了该线程作为其他线程的副本.另一个线程不相关,它不是在谈论接收其他特定过程的信息].
我正在玩更高级的,我正在尝试使用compose.我有以下代码:
def p2( a : Int) = a + 2
def p3( a : Int) = a + 3
val p5 = p2 _ compose p3
def pn3[T](n : T)(implicit ev : Numeric[T]) = ev.plus(n, ev.fromInt(3))
val pn5 = p2 _ compose pn3
Run Code Online (Sandbox Code Playgroud)
这一切都有效,直到最后一行:
error: could not find implicit value for parameter ev: Numeric[T]
Run Code Online (Sandbox Code Playgroud)
这是有道理的,但我怎么告诉它,"我想要Numeric[Int]!"
我想写一个Java函数,它将作为输入int[],float[]或者double[].算法完全相同(某种标量积).如何编写能够处理所有类型数值数组的单个函数?
据我所知,StringBuilder通过在concats期间不在字符串池中创建临时字符串实例来帮助减少内存使用量.但是,如果我这样做会发生什么:
StringBuilder sb = new StringBuilder("bu");
sb.append("b"+"u");
Run Code Online (Sandbox Code Playgroud)
它编译成了吗?
sb.append("b");
sb.append("u");
Run Code Online (Sandbox Code Playgroud)
?或者它取决于优化标志?或者,如果使用stringbuilders,我会失去整个好处?或者这个排队没有意义?:)
我有一个字符串列表,我浏览它并计算"x"字符串的数量如下,但计数不打印我预期的值:
ArrayList<Integer> list = new ArrayList<Integer>();
List<String> strings = table.getValue(); //this gives ["y","z","d","x","x","d"]
int count = 0;
for (int i = 0; i < strings.size(); i++) {
if ((strings.get(i) == "x")) {
count++;
list.add(count);
}
}
System.out.println(list);
Run Code Online (Sandbox Code Playgroud)
这给[]它应该是2因为我有2次出现"x"
我想用Java知道:
我在下面的链接中读到,由于线程共享地址空间,杀死一个线程也会影响其他线程.
以下是这里的引用.
线程是轻量级进程,将主要控制流分为多个流,每个控制/线程流将独立执行.系统中进程的活动由线程表示.具有多个线程的进程称为多线程.每个线程都有自己的线程ID(数据类型整数),寄存器,程序计数器,堆栈,错误号.线程可以在同一进程中使用共享内存进行通信.使用线程来管理和维护应用程序的子任务有不同的优点.当我们使用线程时,使用较少的系统资源进行上下文切换并增加应用程序的吞吐量.线程还简化了程序的结构.任务之间没有特殊的通信机制.线程也有一些缺点,例如线程不可重用,因为它们依赖于进程并且不能与进程分离.线程不是孤立的,因为它们没有自己的地址空间.线程导致的错误可能会终止整个进程或程序,因为该错误会影响该进程或程序中使用的所有线程的整个内存空间.由于线程共享资源在进程中也可能影响整个进程或程序在线程资源损坏时.对于内存线程的并发读写访问将需要同步.线程通过数据竞争很容易损坏进程的数据,因为进程中的所有线程都具有对同一条数据的写访问权.
您可以告诉我们上述链接中的内容是否适用于java