ANTLR4获取scala代码的解析树,我做错了什么?
我正在尝试解析一个简单的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
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
;