gpt4 book ai didi

parsing - 如何使用 Scala Parser Combinators 更改代码以考虑运算符优先级?

转载 作者:行者123 更新时间:2023-12-04 08:29:09 25 4
gpt4 key购买 nike

考虑这部分语法:

  def expression = SimpleExpression ~ opt(relation ~ SimpleExpression)
def relation = "=" | "#" | "<=" | "<" | ">=" | ">" | "IN" | "IS"
def SimpleExpression = opt("+" | "-") ~ rep1sep (term, AddOperator)
def AddOperator = "+" | "-" | "OR"
def term = factor ~ rep(MulOperator ~ factor)
def MulOperator = "*" | "/" | "DIV" | "MOD" | "&"
def factor: Parser[Any] = number | "(" ~ expression ~ ")" | "~" ~ factor

是否有必要重写其中的一部分以创建新规则,或者是否只有一种方法(例如 |||| 用于第一次与最长规则匹配)我目前缺少哪个做必要的事情?

最佳答案

运算符优先级是规则编写方式的自然结果。例如,在这个文法中 SimpleExpressionterm 的加法、减法和逻辑或组成, 和 term由乘法、除法、模数和逻辑与组成 factor .

所以如果你有这个:

1 + 2 * 3

你会得到以下信息(粗略地说,为了清楚起见):
List(1, (2 ~ List(* ~ 3)))

如果你有这个:
1 * 2 + 3

你会得到这个(粗略地说):
List((1 ~ List(* ~ 2)), 3)

由于 rep1sep,您失去了加法运算符-- 分隔符被丢弃。

关于parsing - 如何使用 Scala Parser Combinators 更改代码以考虑运算符优先级?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6562414/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com