Я пытаюсь написать промежуточные представления для выражений типа:Промежуточных представления с использованием JavaCC
a= 1+2-3*5/6
a= 1+2-3
a= 5/6+3
Я довольно новый для JavaCC
, но у меня есть базовые знания о генерации AST
с использованием JJTree
. Я не делал отдельный класс для IR
или реализовал его с помощью JJTree
. Я написал грамматику и попытался реализовать IR
прямо в ней.
Код:
// E -> T (addop T)*
// T -> F (mulop F)*
// F -> intlit | "(" E ")"
SKIP :
{
" "
| "\t"
| "\n"
| "\r"
}
TOKEN :
{
< ADDOP :
"+"
| "-" >
| < MULOP :
"*"
| "/" >
| < INTLIT : ([ "0"-"9" ])+ >
}
String S() :
{
String s;
}
{
s = E()
{
return "a=" + s;
}
}
String E() :
{
String left, right;
Token op;
}
{
left = T()
(
op = <ADDOP> right = T()
{
left = ("t" + count++) + ": " + left + op.image + right + "\t";
}
)*
{
return left;
}
}
String T() :
{
String left, right;
Token op;
}
{
left = F()
(
op = <MULOP> right = F()
{
left = ("t" + count++) + ": " + left + op.image + right;
}
)*
{
return left;
}
}
String F() :
{
String s;
Token t;
}
{
t = <INTLIT>
{
return t.image;
}
}
Мой код работает отлично для выражения как 1+2*3;
или 1-2/4;
где конкретный оператор не повторяются в выражении.
Это дало бы грязный выход для выражения, где один из + -
или * /
является повторяющимся или + -
или / *
, оба включены в выражении. например 1+2-4
(+ - оба включая), 1-2-3
(минус повторяющийся) и т.п.. (прилагается picture for output)
Мои вопросы:
Как я могу устранить указанные выше проблемы?
Если мой способ делать IR
в грамматике файле/класс не подходит, то , что является лучшим способом для выполнения IR
в JavaCC
? **
Для ввода '1-2-3', что именно выход вы хотите? –
Аналогично для '(1-2) -3'. –
для 1-2-3 Я хотел бы t0: 1-2, t1: t0-3, a = t1 –