Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala-StdTokenParsers的解析与预期不完全一样_Scala_Parsing - Fatal编程技术网

Scala-StdTokenParsers的解析与预期不完全一样

Scala-StdTokenParsers的解析与预期不完全一样,scala,parsing,Scala,Parsing,我的任务是解析演示语言,这是有问题的代码,其他工作如我所料: def parse(s: String) = phrase(program)(new lexical.Scanner(s)) def program: Parser[Any] = rep(sttment) //Operator def expression: Parser[Any] = lv1 ~ rep(("<" | ">" | "<=" | ">=") ~ lv1) def

我的任务是解析演示语言,这是有问题的代码,其他工作如我所料:

  def parse(s: String) = phrase(program)(new lexical.Scanner(s))

  def program: Parser[Any] = rep(sttment)



  //Operator

  def expression: Parser[Any] = lv1 ~ rep(("<" | ">" | "<=" | ">=") ~ lv1)

  def lv1: Parser[Any] = lv2 ~ rep(("<>" | "==") ~ lit)

  def lv2: Parser[Any] = lit ~ opt("." ~ ident ~ opt("(" ~ repsep(expression, ",") ~ ")"))

  def lit: Parser[Any] = ident | boollit | floatlit | intlit | stringlit

  // Statements
  def sttment: Parser[Any] = sttm | "{" ~  rep(sttment) ~ "}"

  def sttm: Parser[Any] = (assignment ||| returnsttm ||| invokesttm ||| ifsttm ||| whilesttm |||
        repeatsttm ||| forsttm ||| breaksttm ||| continuesttm ) ~ ";"

  def assignment: Parser[Any] = lhs ~ ":=" ~ expression

  def lhs: Parser[Any] = ( "self" ~ "." ~ ident )|||( ident ~ "." ~ ident )|||( ident ~ "[" ~ expression ~ "]")|||ident

  def ifsttm: Parser[Any] = "if" ~ expression ~ "then" ~ sttment ~ opt("else" ~ sttment)

  def whilesttm: Parser[Any] = "while" ~ expression ~ "do" ~ sttment

  def repeatsttm: Parser[Any] = "repeat" ~ sttment ~ "until" ~ expression

  def forsttm: Parser[Any] = "for" ~ ident ~ ":=" ~ expression ~ ("to" | "downto") ~ expression ~ "do" ~ sttment

  def breaksttm: Parser[Any] = "break"

  def continuesttm: Parser[Any] = "continue"

  def returnsttm: Parser[Any] = "return" ~ expression

  def invokesttm: Parser[Any] = expression ~ "." ~ ident ~ "(" ~ repsep(expression, ",") ~ ")"

  def primtype: Parser[Any] = "integer" | "float" | "bool" | "string" | "void"


  def boollit: Parser[Any] = elem("boolean", _.isInstanceOf[lexical.BooleanLit])

  def floatlit: Parser[Any] = elem("real", _.isInstanceOf[lexical.FloatLit])

  def intlit: Parser[Any] = elem("integer", _.isInstanceOf[lexical.IntLit])

  def stringlit: Parser[Any] = elem("string", _.isInstanceOf[lexical.StringLit])
它返回:

``.'' expected but `;' found"
在返回1。有人能告诉我我犯了什么错误吗

编辑: -很抱歉,因为我对我的问题理解不够,我问错了,现在我写下了它所犯的确切错误

分隔符和关键字列表:

reserved++=Listbool,break,continue,do,downto,else,float,for, 如果,integer,new,repeat,string,then,to,until,while,return, true、false、void、null、self、final、class、extends、abstract

分隔符++=列表[,],:。,,{, }, +, =, -, *, /, \, %, :=, ==, =, &&, !, ||, ^


我必须查看更多的代码才能确定,但我在sttm列表中没有看到returnsttm。这将阻止stt在查找开始大括号之前匹配returnsttm。

看起来它们像预期的那样工作-io.writeFloatLns.getArea被解析为语句内的表达式-所以解析器正在等待。根据你的陈述,类似于:

io.writeFloatLn(s.getArea()).writeFloatLn()

我认为括号只能用作语句调用操作的一部分,或者只能用作表达式应用程序的一部分,这取决于您需要哪种语言—命令式语言还是函数式语言。与..

相同,returnsttm是前面代码中从底部算起的第二个,如果它不在那里,我想我的程序甚至不会编译,现在它是从底部算起的第七个。我已经编辑了代码,所以它有一个解析开始。你能再复习一下这个问题吗?我前面的问题完全错了。为什么def sttat=sttm{~repsttation}而不是sttat=sttm{~repsttation}?@dk14嗯,为什么@dk14对不起,我问错了,请重新检查我的问题。虽然我认为|的优先级较低,所以没有必要放在括号内。请再次编辑您的问题-您没有指定在哪个位置。你犯了一个错误,正如我从语法中看到的那样,没有错误invokesttm中括号内的ident-so解析器在这里只需要一个简单的表达式。你是对的,那么我该如何摆脱它呢?Invoke语句必须以表达式开头。我编辑了答案。您可以查看您的BNF语法-括号和。不能同时是表达式和语句的一部分-它是两种操作之一:应用程序操作或调用操作-不能同时使用一种语言。谢谢,您的意思是:~expression~~~.~ident?我的意思是,您可以删除调用,并可以改进您的表达式。例如,Scala本身在AST中没有调用-仅应用。
io.writeFloatLn(s.getArea()).writeFloatLn()