루비에서 수학 표현식에 대한 내 자신의 평가자를 작성하려고하는데, 그 전에 표현식을 트리 (배열)로 나누기 위해 파서를 구현하려고하기 전에, . 올바르게 괄호로 표현식을 나누지 만, 연산자 우선 순위가있는 표현식을 올바르게 추가하는 방법을 찾는 데 많은 어려움을 겪고 있습니다.수학 파서 (루비)에서 더하기 연산자를 구현하는 방법
지금은 1+2*3+4
과 같은 문자열이 1+[2*3]+4
대신 1+[2*[3+4]]
이됩니다. 가능한 가장 간단한 해결책을 찾으려고합니다. 당신이 정말로 자신을 구문 분석 식을해야 할 경우에는 다음 식의 양쪽 모두를 검색 (예 : '2 * 3'등)와 함께 그를 교체해야합니다,
@d = 0
@error = false
#manipulate an array by reference
def calc_expr expr, array
until @d == expr.length
c = expr[@d]
case c
when "("
@d += 1
array.push calc_expr(expr, Array.new)
when ")"
@d += 1
return array
when /[\*\/]/
@d +=1
array.push c
when /[\+\-]/
@d+=1
array.push c
when /[0-9]/
x = 0
matched = false
expr[@d]
until matched == true
y = expr.match(/[0-9]+/,@d).to_s
case expr[@d+x]
when /[0-9]/
x+=1
else matched = true
end
end
array.push expr[@d,x].to_i
@d +=(x)
else
unless @error
@error = true
puts "Problem evaluating expression at index:#{@d}"
puts "Char '#{expr[@d]}' not recognized"
end
return
end
end
return array
end
@expression = ("(34+45)+(34+67)").gsub(" ","")
evaluated = calc @expression
puts evaluated.inspect
지원하고자하는 수학 문법을 나타내는 구문 분석 표현 문법을 설정하려면 [Treetop] (http://cjheath.github.io/treetop/)을 적극 권장합니다. – Phrogz
또한 [PEG.js로 완전한 수학 표현식 파싱하기] (http://stackoverflow.com/questions/19390084/parsing-complete-mathematical-expressions-with-peg-js) – Phrogz
을 참조하십시오. JavaScript 언어, 적절한 연관성을 가진 모든 수학 부분을 포함 : https://github.com/pegjs/pegjs/blob/master/examples/javascript.pegjs#L735 – Phrogz