Захотелось написать зародыш компилятора )))
Интерпретатор:
Теперь компилятор. Компилирует в псевдокод для стековой машины.
Интерпретатор:
function oper(src) return src:match'^([-+*/]?)%s*(.*)' end function number(src) return src:match'^(%d*)%s*(.*)' end operators = { { ['+'] = function(a,b) return a+b end, ['-'] = function(a,b) return a-b end },{ ['*'] = function(a,b) return a*b end, ['/'] = function(a,b) return a/b end } } function expr(src, pri) local a,b,n,r,op pri = pri or 1 op = operators[pri] if op then a, src = expr(src, pri+1) r, src = oper(src) while op[r] do b, src = expr(src, pri+1) a = op[r](a,b) r, src = oper(src) end return a, r..src end r, src = number(src) if r=='' then error('number expected: '..src) end return r, src end print(expr('2 + 2 * 3')) -- 8В operators операции расположены по приоритетам (низкий в начале). Можно добавлять свои операции.
Теперь компилятор. Компилирует в псевдокод для стековой машины.
function oper(src) return src:match'^([-+*/]?)%s*(.*)' end function number(src) return src:match'^(%d*)%s*(.*)' end operators = { { ['+'] = 'ADD', ['-'] = 'SUB'}, { ['*'] = 'MUL', ['/'] = 'DIV'} } function expr(src, pri) local r, op pri = pri or 1 op = operators[pri] if op then src = expr(src, pri+1) r, src = oper(src) while op[r] do src = expr(src, pri+1) print(op[r]) r, src = oper(src) end return r..src end r, src = number(src) if r=='' then error('number expected: '..src) end print('PUSH '..r) return src end expr('2+2*3+2')Результат:
PUSH 2 PUSH 2 PUSH 3 MUL ADD PUSH 2 ADD
Комментариев нет:
Отправить комментарий