2016-04-10 4 views
1

Я пытаюсь написать промежуточные представления для выражений типа:Промежуточных представления с использованием 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? **

+0

Для ввода '1-2-3', что именно выход вы хотите? –

+0

Аналогично для '(1-2) -3'. –

+0

для 1-2-3 Я хотел бы t0: 1-2, t1: t0-3, a = t1 –

ответ

0

Что бы сделать, это использовать буфер строки, вывод поток или измененный список, чтобы скопировать четверки и вернуть значение или промежуточное представление, представляющее значение каждого нетерминала в результате.

Е.Г., например

String E(StringBuffer buf) : 
{ 
    String left, right; 
    Token op; 
} 
{ 
    left = T(buf) 
    (
     op = <ADDOP> right = T(buf) 
     { 
     left = buildQuad(buf, left, op.image, right) ; 
     } 
)* 
    { 
    return left; 
    } 
} 

где buildQuad определяется как

String buildQuad(StringBuffer buf, String left, String op, String right) 
{ 
    String register = "t" + count++ 
    buf.append(register + ": " + left + op + right + "\t"); 
    return register ; 
}