我正在努力制作一个识别操作的解析器。运算符可以是二进制算术:(+, - ,*,/),二进制关系:(==,<>)或一元(++, - )。
算术运算符应具有正确的关联性,关系运算符不具有关联性。运算符的优先级是:第一乘法(*,/),第二加法(+, - )和最后一个关系(==,&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() : {}
{
"=="
| "<>"
}
感谢。
答案 0 :(得分:0)
几乎就在那里。将表达式更改为
void Expression() : {}
{
OtherTerms() [RelationOp() OtherTerms()]
}
我不确定["-"]
在那里做了什么,因为你对语法的描述并没有提到一元-
。所以其余的是基于对语言可能是什么以及优先级如何的推测。
如果你希望一元减号除了++
和--
之外具有最高优先级 - 在C--中将因子改为
void Factor() : {}
{
"-" Factor()
| <Id> [("++" | "--")]
| ...etc...
}
如果您希望一元减号的优先级低于*
和/
,则可以将Factor
更改为
void Factor() : {}
{
"-" Term()
| <Id> [("++" | "--")]
| ...etc...
}
这会使你的语法含糊不清 - 例如-a*b
有两个解析 - 所以JavaCC会发出警告,但你可以放心地忽略这个警告;只会进行正确的解析。