我正在使用scala的解析器编写极简单的编程语言。我试图让用户拥有多字变量,即sequence
,我想让他们以三种方式分配变量:my variable
,let var = 2
,var =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.问题是它只是将其解析为参考
答案 0 :(得分:0)
为什么在'optional''之前标识符中有空格?'符号:
0-9]* ?)+
可能是造成
set <identifier>
更改为
设置other_chars
和set
成为标识符的部分。这可以解释为什么你使用
"set" ~ "[" ~> identifier <~ "]"
有效但
"set" ~> identifier <~ "to"
没有