문제

숙제를 위해 Excel과 같은 C ++ 콘솔 앱을 작성하고 있습니다. 내 앱은 셀에 대한 공식을 받아 들일 수 있어야합니다. 예를 들어 다음과 같은 것을 평가해야합니다.

Sum(tablename\fieldname[recordnumber], fieldname[recordnumber], ...)

tablename\fieldname[recordnumber] points to a cell in another table, 
fieldname[recordnumber] points to a cell in current table

또는

Sin(fieldname[recordnumber])

또는

anotherfieldname[recordnumber]

또는

"10" // (simply a number)

그런 것. 함수는 합, Ave, Sin, Cos, Tan, Cot, Mul, Div, Pow, Log (10), LN, Mod입니다.

한심한 사람이지만 알고 있지만 내 숙제입니다 : '(

그렇다면 누구든지 이와 같은 것을 평가할 속임수를 아는 사람이 있습니까?

도움이 되었습니까?

해결책

좋아, 좋은 숙제 질문.

그것은 정말로 당신이 얼마나 무겁기를 원하는지에 달려 있습니다. 완전한 표현 파서 (재미 있지만 시간이 많이 걸리는)를 만들 수 있습니다.

그렇게하려면 전체 문법을 설명하고 프론트 엔드를 작성해야합니다 (Lex와 YACC 또는 Flexx 및 Bison을 살펴보십시오.

그러나 당신의 질문을 볼 때 당신은 자신을 세 가지 하위 가위로 제한 할 수 있습니다.

  • 간단한 가치
  • 조회 (아마도 다른 테이블에)
  • 입력하는 함수는 조회입니다

약간의 oo 디자인이 여기서 당신을 도울 수 있다고 생각합니다.

실시간 새로 고침 및 원형 의존성 검사를 처리 해야하는지 확실하지 않습니다. 그렇지 않으면 그들은 또한 까다로울 수 있습니다.

다른 팁

구문 분석을 위해, 나는 재귀적인 하강 구문 분석을 살펴 봅니다. 그런 다음 가능한 모든 함수 이름을 맵핑하여 기능 포인터를 제공하는 테이블이 있습니다.

struct FunctionTableEntry {
    string name;
    double (*f)(double);
};

파서를 써야합니다. 파서는 각 줄 표현을 취해야하며 명령을 식별하고 구문 분석 트리를 구성해야합니다. 이것이 첫 번째 단계입니다. 두 번째 단계에서는 명령의 각 요소에 대한 데이터를 대체하여 트리를 평가할 수 있습니다.

이전 응답자들은 머리에 닿았습니다. 셀 내용을 구문 분석하고 해석해야합니다..

StackoverFlow는 이미 자원에 대한 포인터를 찾을 수있는 컴파일러 및 간격에 대한 많은 질문이 있습니다. 그들 중 일부는 다음과 같습니다.

등등.

따로 : 나는 그것들을 모두 연결하거나 종합적인 목록을 만들려고 노력할 에너지가 없습니다.

YACC/Lex (또는 같은)를 사용할 수 없으므로 "수동으로"구문 분석해야합니다.
문자열을 반복하여 부분으로 나눕니다. 부분이 당신의 문법 (구문)에 달려 있습니다. 이렇게하면 함수 이름과 매개 변수를 찾을 수 있습니다. 이것의 어려움은 구문의 복잡성에 달려 있습니다.

어쩌면 당신은 조금 읽어야 할 것입니다 어휘 분석.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top