考虑LL1语法:::=||num::=+::=*
现在考虑scala case类的集合。下面给出了代码,我只需要在exp()和time()方法中添加代码
sealed abstract class Token
case object PlusToken extends Token
case object TimesToken extends Token
case class NumToken(value:Int) extends Token
def isExpr(tokens:List[Token]):Boolean = {
var remaining = tokens
object ParseError extends Exception
def expr():Unit = // ** add code here
def plus():Unit = {
if (remaining.headOption != Some(PlusToken)) throw ParseError
remaining = remaining.tail
expr()
expr()
}
def times():Unit = // ** add code here
try {
expr()
if (remaining.isEmpty)
true
else
false
} catch {
case ParseError => false
}
}
我需要添加expr()和time()方法的代码,以便isExpr()返回传递给它的令牌列表是否可以根据语法派生。
输出应采用以下方式:
isExpr(List(PlusToken, NumToken(5), NumToken(3))) => true
isExpr(List(PlusToken, PlusToken)) => false
isExpr(List(PlusToken, NumToken(1))) => false
isExpr(List(PlusToken, NumToken(9), NumToken(8), NumToken(7))) => false
以下是我为exp()和time()方法编写的代码:
sealed abstract class Token
case object PlusToken extends Token
case object TimesToken extends Token
case class NumToken(value:Int) extends Token
def isExpr(tokens:List[Token]):Boolean =
{
var remaining = tokens
object ParseError extends Exception
def expr():Unit = // ** add code here
{
if(remaining.HeadOption == Some(PlusToken))
plus()
else if(remaining.headOption == Some(TimesToken))
times()
else remaining = remaining.tail
}
def plus():Unit =
{
if (remaining.headOption != Some(PlusToken)) throw ParseError
remaining = remaining.tail
expr()
expr()
}
def times():Unit = // ** add code here
{
if (remaining.headOption != Some(TimesToken)) throw ParseError
remaining = remaining.tail
expr()
expr()
}
try
{
expr()
if (remaining.isEmpty)
true
else
false
} catch
{
case ParseError => false
}
def main(argv: Array[String]) {}
}
对于我的代码,我得到了编译时错误。错误为:除外的类或对象定义。此外,我不知道如何使用main类来打印预期的内容。请查看我的scala代码,因为我对它完全陌生,并提供您的输入。
您在对象(class
、trait
或object
)之外编写代码,正如错误所述。因此,您需要将代码封装在其中一个结构中。
对象示例
object Main {
def someMethod....
def main(argv: Array[String]) {
...main entry point of your system...
}
}