我对 ANTLR4 很陌生,现在我正在尝试了解我们可以用它定义哪种语法。
据我所知,ANTLR 中有两种规则:解析器规则(小写单词)和词法分析器规则(大写单词)。例子:
grammar Test;
init: prog(','prog)*;
prog: A
| prog
;
A: [a-z]+;
Run Code Online (Sandbox Code Playgroud)
从语法产生式规则的角度来看,我会说解析器规则是非终端符号,可以用词法分析器规则定义的一系列标记替换。
因此,很明显,语法根据定义是与上下文无关的。由语法生成的语言字母表由小写拉丁字母组成的所有单词组成。
问题:我们可以使用 定义非上下文无关文法ANTLR4吗?
我阅读了javadocFile类。这是那里写的:
通过将给定的路径名字符串转换为抽象路径名来创建一个新的 File 实例。如果给定的字符串是空字符串,则结果是空的抽象路径名。
问题:是否保证如果文件不存在就不会创建空文件或取决于系统?我在 RedHat linux 上尝试过,只有在我创建OutputStream.
从java对我来说并不明显。
我认为我们可以依赖于转换scala.Double为的隐式转换java.lang.Double.所以我尝试了以下方法:
import scala.collection.JavaConverters._
object Main extends App {
def main(args: Array[String]) = {
val m = Map("10" -> 20.0)
doSome(m.asJava) //error. Type mismatch found: java.util.Map[String,scala.Double]
// required: java.util.Map[String,java.lang.Double]
doSome2(m.asJava)
}
def doSome(m: java.util.Map[java.lang.String, java.lang.Double]) = println(m)
def doSome2(m: java.util.Map[java.lang.String, Double]) = println(m)
}
Run Code Online (Sandbox Code Playgroud)
为什么不起作用?执行此类转换的惯用方法是什么?
我是斯卡拉的新手,但现在我想用它scala.collection.SortedMap来翻新地板.我的意思是这样的:
val m = SortedMap[Long, String]()
def retreiveAndProcess(l: Long) = {
val floor = // get the floor of l to m
//do some with floor
}
Run Code Online (Sandbox Code Playgroud) 我是Scala的新手,对模式匹配的工作原理有点疑惑.想象一下,我有以下几点:
case class Cls(i: Int)
case b @ Cls(i) => //Ok
case e : Cls => //Ok
case f @ Cls => //Ok
case s: Cls(i) => //compile error
case str: String => //ok
Run Code Online (Sandbox Code Playgroud)
我不太明白在哪里使用@以及在哪里使用:.是否有一些严格定义的规则?
我试图了解如何使用Monad变形金刚。我阅读了有关它的Wiki文章,但仍有一些疑问。
我们的IOmonad需要读取用户的输入。但是并非总是提供输入。就是这样Option。为简化起见,我们可以定义一个OptionT“封装” IO单子动作的单子。
在我的特殊情况下,我有两个类型为Future[Option[String]]和的单子Future[List[Int]]。就是说,为简化起见,我需要两个不同的转换器,ListT[T]并且OptionT[T]对于每种monad类型,我都需要在其中嵌入Future行为...对吗?
我正在尝试使用andThen方法来注册未来的行动阶段.像这样:
implicit val executionContext = ExecutionContext.global
val f = Future(0)
f.andThen {
case r => println(r.get + "1")
} andThen {
case r => println(r.get + "2")
}
Run Code Online (Sandbox Code Playgroud)
由于此方法异步执行并且不生成返回值,因此抛出的任何非致命异常都将报告给ExecutionContext.
异步是什么意思?它意味着与未来的执行本身异步?
我试图了解垃圾收集算法的工作原理.我正在读这篇文章.据我所知,每一个分配都发生在Young一代.如果没有足够的可用空间可以Minor GC触发清洁Young代(Eden,S1,S2).但现在想象我们有一些类:
public class TestYoungCrash{
private long l1;
private long l2;
//...
private long l100000000;
//tons of other fields
}
Run Code Online (Sandbox Code Playgroud)
所以即使这一代人完全清楚,班级的目标也不适合年轻一代.
那会发生什么?它是标准化的吗?
我在使用 spark 历史服务器时遇到了一些问题,因此尝试lz4手动解压缩日志。我安装liblz4-tool并下载了应用程序日志application_1510049252849_0303.lz4。但是当lz4 ~/application_1510049252849_0303.lz4我解压缩它时出现以下错误:
Error 44 : Unrecognized header : file cannot be decoded
Run Code Online (Sandbox Code Playgroud)
这是我对每个火花历史lz4文件都有的。解决办法是什么?有没有办法手动打开?
我正在尝试使用for -reherehension以下内容:
val s: Seq[Option[Int]] = //...
val t: Option[Int] = //...
s.map(sv => t.flatMap(tv => sv.map(_ == tv)))
Run Code Online (Sandbox Code Playgroud)
我试过这个:
val r: Seq[Option[Boolean]] = for(
sv <- s;
tv <- t;
svv <- sv
) yield svv == tv //Seq[Boolean] does not conform to Seq[Option[Boolean]]
Run Code Online (Sandbox Code Playgroud)
有没有办法简明扼要地写for-comprehension?