BOJ 7607:: List Calculator

https://www.acmicpc.net/problem/7607

구현지옥

print, 대입을 제외한 리스트의 문법은 아래와 같습니다.

<list>     ::= <seg> (":" <seg>)*
<seg>      ::= <term> (("+" | "-") <term>)*
<term>     ::= <factor> (("*" | "/") <factor>)*
<factor>   ::= <primary> | ("+" | "-" | "*" | "/") <factor>
<primary>  ::= <unsliced> ("[" <num>? ":" <num>? "]")*
<unsliced> ::= <num> | <var> | "(" <list> ")"

<num>은 정수 리터럴, <var>은 변수 이름입니다.

수식 평가가 조금 더러운데, 무한 수열을 다뤄야 하는 특성상 리스트 객체를 만들고 평가 결과가 리스트 객체를 반환하게 할 수가 없습니다. 따라서 평가 함수가 인덱스를 받고, 그 인덱스에 해당하는 원소를 반환하도록 하면 재귀함수 짜듯이 아주 편하게 구현할 수 있습니다.