Scala Parser组合器匹配错误的解析器

时间:2016-02-26 21:05:41

标签: scala parsing language-design parser-combinators

我正在使用scala的解析器编写简单的编程语言。我试图让用户拥有多字变量,即sequence,我想让他们以三种方式分配变量:my variablelet var = 2var =2。我有前两个工作,但我不能让后者工作。

这是我的代码

set var to 4

元素是语言中的大多数东西。

我想用:

替换assignmentLHS解析器
      lazy val line:PackratParser[Line] = (assignment | element | comment) <~ (";" | "[\n\r]*".r)

      lazy val assignment:PackratParser[Assignment] = assignmentLHS ~ element ^^ {
        case x ~ y => new Assignment(x,y)
      }

      lazy val assignmentLHS =  "set" ~ "[" ~> identifier <~ "]" ~ "to" | ("let"?) ~> identifier <~ "="

      lazy val identifier:Parser[String] = "([a-zA-Z]+[a-zA-Z0-9]* ?)+".r ^^ (X => if (X.charAt(X.length-1) == ' ') X.substring(0, X.length-1) else X)

     lazy val element:PackratParser[Element] =(
        functionDef
      | comparison
      | expression
      | boolean
      | controlStatement
      | functionCall
      | reference
      | value
      | codeBlock

    )
    lazy val reference: PackratParser[Reference] = identifier ^^ (x=>new Reference(x))

这样用户就可以编写 lazy val assignmentLHS = "set" ~> identifier <~ "to" | ("let"?) ~> identifier <~ "=" 而不是`set [my variable] to 4.问题是它只是将其解析为参考

1 个答案:

答案 0 :(得分:0)

为什么在'optional''之前标识符中有空格?'符号:

0-9]* ?)+

可能是造成

set <identifier>

更改为

设置other_chars

set成为标识符的部分。这可以解释为什么你使用

"set" ~ "[" ~> identifier <~ "]"

有效但

"set" ~> identifier <~ "to" 

没有