shuntingyard - tos = operators[#operators] end...

Info iconThis preview shows pages 1–2. Sign up to view the full content.

View Full Document Right Arrow Icon
--[[ Precedence: (lower - higher) - left 2 + left 3 / left 4 % left 5 * left 6 ^ left 7 --]] patterns = {"%d+","-","+","/","%%","*","%^","%(","%)"} function lex(str) for i,p in ipairs(patterns) do local a,b = str:find(p) if a == 1 then local token = {i,str:sub(a,b)} setmetatable(token, {__tostring = function(self) return string.format("%s",self[2]) end}) str = str:sub(b+1) return token, str end end print(string.format("Cannot tokenize the string '%s'",str)) return nil end function interp(str) str = str:gsub("%s","") local token = nil local operators, operands = {}, {} while #str > 0 do token, str = lex(str) if token[1] == 1 then -- push number onto operands stack table.insert(operands, tonumber(token[2])) elseif token[1] == 8 then -- push lparen onto operators stack table.insert(operators, token) elseif token[1] == 9 then -- pop from operators until lparen local tos = operators[#operators] while tos[1] ~= 8 do operators[#operators] = nil operands = apply(operands, tos)
Background image of page 1

Info iconThis preview has intentionally blurred sections. Sign up to view the full version.

View Full DocumentRight Arrow Icon
Background image of page 2
This is the end of the preview. Sign up to access the rest of the document.

Unformatted text preview: tos = operators[#operators] end operators[#operators] = nil else-- operators-- while there are operators on the stack whose precedence is higher, pop those while #operators > 0 do local tos = operators[#operators] if token[1] <= tos[1] and tos[1] ~= 8 then operands = apply(operands, tos) operators[#operators] = nil else break end end table.insert(operators, token) end end-- reduce everything else on the operator stack while #operators > 0 do local tos = operators[#operators] if tos[1] ~= 8 then operands = apply(operands, tos) operators[#operators] = nil else return nil end end return operands[#operands] end function apply(operands, token) local b = operands[#operands] operands[#operands] = nil local a = operands[#operands] operands[#operands] = loadstring(string.format("return (%s) %s (%s)",a,token[2],b))() return operands end print(interp("(6*(4+3)^3-10)/2^10"))...
View Full Document

This note was uploaded on 03/12/2012 for the course CS 4820 taught by Professor Kleinberg during the Spring '08 term at Cornell University (Engineering School).

Page1 / 2

shuntingyard - tos = operators[#operators] end...

This preview shows document pages 1 - 2. Sign up to view the full document.

View Full Document Right Arrow Icon
Ask a homework question - tutors are online