带运算符的语法表达式
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 会发出警告,但您可以安全地忽略此警告;只会进行正确的解析。
我正在努力制作一个识别操作的解析器。运算符可以是二元算术:(+,-,*,/),二元关系:(==,<>)或一元(++,--).
算术运算符应该有正确的结合性,关系运算符没有结合性。运算符的优先级是:首先是乘法(*、/),其次是加法(+、-),最后是关系(==、<>)。如果有任何一元运算符,它应该在 <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 会发出警告,但您可以安全地忽略此警告;只会进行正确的解析。