运算符

时间:2015-06-20 17:59:05

标签: javacc

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

算术运算符应具有正确的关联性,关系运算符不具有关联性。运算符的优先级是:第一乘法(*,/),第二加法(+, - )和最后一个关系(==,&lt;&gt;)。如果有任何一元运算符,则应该在<Id>之后。

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

实施例: ab--,cd ++,ef(a-- * b ++),ij(aa ++ + b),c&lt;&gt; a * b,d ++ * 3,c == true,l ++ + m(a,a)

坏情况: 3 ++,3.1 ++,(a)++,a()++,true ++

这是我使用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() : {}
    {
        "=="
        | "<>"
    }

感谢。

1 个答案:

答案 0 :(得分:0)

几乎就在那里。将表达式更改为

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

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

如果你希望一元减号除了++--之外具有最高优先级 - 在C--中将因子改为

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

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

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

这会使你的语法含糊不清 - 例如-a*b有两个解析 - 所以JavaCC会发出警告,但你可以放心地忽略这个警告;只会进行正确的解析。