带运算符的语法表达式

Grammar expressions with operators

我正在努力制作一个识别操作的解析器。运算符可以是二元算术:(+,-,*,/),二元关系:(==,<>)或一元(++,--).

算术运算符应该有正确的结合性,关系运算符没有结合性。运算符的优先级是:首先是乘法(*、/),其次是加法(+、-),最后是关系(==、<>)。如果有任何一元运算符,它应该在 <Id>.

之后

在表达式中可以是括号,它们具有最高优先级。

例子: ab--, cd++, ef(a-- * b++), ij(aa++ + b), c <> a * b, d++ * 3, c == true, l++ + m(a, a)

不良案例: 3++, 3.1++, (a)++, a()++, 真++

这是我使用 RelationOp() 的代码,但它无法识别添加项。在 Expression 方法中使用 AdtOp() 更改 RelationOp() 可以识别添加项,但我不知道我需要更改什么才能使其工作关系运算符。

void Expression() : {}
    {
        ["-"] Term() [RelationOp() OtherTerms()]
    }

void Term() : {}
    {
        Factor() [MultiOp() Term()]
    }

void OtherTerms() : {}
    {
        Term() [AdtOp() OtherTerms()]
    }

void Factor() : {}
    {
        <Id> [("++" | "--")]
        | <ConstFloat>
        | <ConstInt>
        | "(" Expression() ")"
        | "true"
        | "false"
    }

void AdtOp() : {}
    {
        "+"
        | "-"
    }

void MultiOp() : {}
    {
        "*"
        | "/"
    }

void RelationOp() : {}
    {
        "=="
        | "<>"
    }

谢谢。

快到了。将表达式更改为

void Expression() : {}
    {
        OtherTerms() [RelationOp() OtherTerms()]
    }

我不确定 ["-"] 在那里做什么,因为你对语法的描述没有提到一元 -。所以剩下的就是基于对语言可能是什么以及优先级如何的猜测。

如果您希望一元减号具有除 ++-- 之外的最高优先级——如在 C 中——将 Factor 更改为

void Factor() : {}
    {
          "-" Factor()
        | <Id> [("++" | "--")]
        | ...etc...
    }

如果您希望一元减号的优先级低于 */,您可以将 Factor 更改为

void Factor() : {}
    {
          "-" Term()
        | <Id> [("++" | "--")]
        | ...etc...
    }

这会使您的语法不明确——例如 -a*b 有两个解析——因此 JavaCC 会发出警告,但您可以安全地忽略此警告;只会进行正确的解析。