현재 저는 매우 간단한 컴파일러를 작성하려고합니다. 내가 shixing - 야드 알고리즘을 사용하여 RPN에 infix 표기법의 수학 방정식을 변환하는 기능을 만들었지 만 문제가 발생했습니다. 중급 표기법의 함수가 올바른 중침 표기법 구문인지 확인하는 간단한 방법이 있는지 궁금 해서요 그래서 변환 기능에서 오류 검사를 포함하지 않았다. 이렇게하면 오류 검사를 통해 현재 변환 기능을 숨기지 않고 유지할 수 있습니다. 당신의 표정은 괄호, 값 (상수 및/또는 식별자), 접두사, 접미사 및 중위 연산자로 구성하는 경우수식 확인 C++
0
A
답변
1
, 두 개의 오류 상태는 점검 할 필요가있다 :
괄호를해야합니다 시합. 병렬 괄호가 입력에서 발견 될 때 스택에서 열린 괄호가 팝핑되는 지점이 알고리즘에 있기 때문에, shunting yard 알고리즘으로이를 알아 채지 못합니다. 스택을 오버랩하거나 입력이 끝날 때 전체 스택을 팝하지 않으면 괄호의 균형이 맞지 않습니다.
토큰은 다음과 같은 간단한 정규식을 준수해야
PRE* VAL POST* (INFIX PRE* VAL POST*)*
PRE
접두사 운영자 또는 (POST
이다 것은 후위 연산자이거나 ) ,210
VAL
는 값 : 상수 또는 식별자 실제로 두 상태의 상태 머신을 감소
(상태 0) "기대 값"이라고 할 수있는 초기 상태와 다른 상태 (상태 1)은 "기대 연산자"라고 부를 수 있습니다. 상태 1 만 허용하고 전환은 다음과 같습니다.
State 0:
PRE → State 0
VAL → State 1
State 1:
POST → State 1
INFIX → State 0
다른 모든 전환은 오류입니다.
단항 마이너스 (및 접두사 또는 중위 어어 될 수있는 다른 연산자)를 제대로 처리하려면이 상태 시스템을 구현해야하며, 입력 핸들링에 통합하는 것이 매우 쉽습니다.
불행히도, 이것은 매우 광범위한 질문입니다. 이런 종류의 것을 구현할 수있는 다양한 방법이 있습니다. 그래서 당신이 묻는 것은 매우 개방적입니다. 특정 질문 (및 일부 코드!)으로 우리를 도와주십시오. – defube
컴파일러 자체가 C++로 작성되었거나 다른 언어로 작성 되었습니까? – RockPaperLizard
구문을 제공 할 수 있습니까? 당신은 단지 "13 42 100 + *"라는 문자열을 사용하고 있습니까? –