ANTLR4获取scala代码的解析树,我做错了什么?

ANTLR4获取scala代码的解析树,我做错了什么?,scala,antlr4,Scala,Antlr4,我正在尝试解析一个简单的scala表达式: vala=4+5 使用antlr4 但是,无论何时运行它,都会出现以下错误: line 1:0 extraneous input 'val a = 4 + 5' expecting {<EOF>, 'implicit', 'lazy', 'case', '@', 'override', 'abstract', 'final', 'sealed', 'private', 'protected', 'import', 'class', 'tra

我正在尝试解析一个简单的scala表达式:
vala=4+5
使用antlr4

但是,无论何时运行它,都会出现以下错误:

line 1:0 extraneous input 'val a = 4 + 5' expecting {<EOF>, 'implicit', 'lazy', 'case', '@', 'override', 'abstract', 'final', 'sealed', 'private', 'protected', 'import', 'class', 'trait', 'package', ';'}
ScalaAlexer和ScalaParser是根据此处的scala语法生成的:

我做错了什么

编辑

在sepp2k的评论之后,我尝试将val v更改为以下内容:

val v = "object Test { def a(): Int = 4 + 5 }"
但同样的错误依然存在。
至于使用blockStat()的建议-它适用于先前的v值

val a=4+5
不是有效的Scala文件。
val
需要位于
特征
对象
(或位于其中一个对象的
def
内)。错误消息提供了可以在顶级或文件中使用的关键字列表

如果您希望能够自行解析
val
定义,则应解析与
compileationunit
不同的规则。如果您试图实现REPL之类的东西,
blockStat
可能有意义,它包括任何可以在块中显示为语句的内容(如本地定义或表达式)


至于为什么它不能与
对象
:显然,语法只允许
对象
,如果它前面有
大小写
(您会注意到
对象
没有出现在最初期望的标记列表中)。如果我们看一下语法,我们会发现:

tmplDef
   : 'case'? 'class' classDef
   | 'case' 'object' objectDef
   | 'trait' traitDef
;
因此,
case
关键字在类定义之前是可选的,但在对象定义之前是必需的


这显然是语法上的一个错误。在真正的Scala语言中,
大小写在两者之前是可选的。

首先,感谢您抽出时间。第二,我看了一下语法。。。我注意到了,但同样的错误仍然存在。。。第2行:0不匹配的输入'case object HelloWorld{'期望{,',implicit',lazy',case','@',override',abstract',final',sealed',private',protected',import',class',trait',package',';'}@Marin-Hm语法似乎比缺少的
更为彻底,但我没有看到其他错误现在,你的输入是有效的-语法是问题所在。
tmplDef
   : 'case'? 'class' classDef
   | 'case' 'object' objectDef
   | 'trait' traitDef
;