문제

나를 용서하십시오, 나는 구문 분석과 Lex/YACC를 완전히 처음 접했고, 아마도 내 머리 위로 가고 있지만 그럼에도 불구하고 :

나는 Ply와 함께 매우 기본적인 계산기를 쓰고 있지만 입력이 항상 방정식이 아닐 수도 있으며, 구문 분석 시점이 있는지 여부를 결정해야합니다. 입력의 극단은 방정식을 완벽하게 평가하는 것이며, 이는 정상을 구문 분석하고 계산하는 방정식 또는 방정식과 같지 않은 무언가, 구문 분석에 실패하고 괜찮습니다.

회색 영역은 방정식과 유사한 부분이있는 입력이며, 그 중 파서가 잡아서 운동합니다. 이것은 내가 원하는 것이 아닙니다. 문자열의 일부가 집어 들지 않고 토큰 화되지 않아 오류를 버릴 수 있지만 어떻게 해야하는지 전혀 모릅니다.

기본적으로 '남은 것을 잡는'토큰을 어떻게 정의 할 수 있는지 아는 사람이 있습니까? 아니면 이것을 처리 할 수있는 더 좋은 방법이 있습니까?

도움이 되었습니까?

해결책

내장이 있습니다 error YACC의 토큰. 일반적으로 다음과 같은 작업을 수행합니다.

라인 : Goodline | 나쁜 선;

Badline : 오류 ' n' / * 필요한 경우 오류 처리 작업 * /

goodline : equation '\n' ;

일치하지 않는 라인 equation 처리됩니다 badline.

사용하고 싶을 수도 있습니다 yyerrok 오류 처리 작업에서 다음 줄에 오류 처리가 재설정되도록합니다.

다른 팁

토큰 (입력 끝)을 정의하고 Lexer가 입력 끝에서 출력하십시오.

따라서이 토큰이 있다면 :

'1' 'PLUS' '1'

당신은 이제 가질 것입니다 :

'1' 'PLUS' '1' 'END_OF_INPUT'

이제 파서에서 최상위 규칙을 정의 할 수 있습니다. (예를 들어) 대신 :

Equation ::= EXPRESSION

당신은 가질 것입니다

Equation ::= EXPRESSION END_OF_INPUT

분명히 Ply Syntax에서이를 다시 작성해야하지만이를 통해 대부분의 방법을 얻을 수 있습니다.

일반적으로 별도의 '명령 판독기'를 사용하여 완전한 명령 (아마도 귀하의 경우 라인)을 호스트 변수 문자열로 얻은 다음 어휘 분석기가 문자열을 분석하도록 정렬합니다. 끝. 설정하기는 어렵지만 일부 클래스의 오류보고를 더 쉽게 만듭니다. 내가이 기술을 사용한 장소 중 하나에는 일상적으로 3 개의 댓글 규칙, 2 개의 인용 된 문자열 세트 및 다른 나스타이가 가장자리에 가장자리에 놓기 (컨텍스트 민감한 토큰 화 - Yuck!)가있는 다중 라인 명령이 있습니다.

그렇지 않으면 YACC '오류'토큰에 대한 Don의 조언이 좋습니다.

이미 해결책을 찾았지만 귀하 또는 다른 사람들이 대체 접근 방식에 관심이있는 경우 다른 제안을 추가하겠습니다.

Ply를 사용하고 있다고 말하지만 컴파일러가 파이썬 환경에서 실행되기를 원하기 때문입니까? 그렇다면 다른 도구도 고려할 수도 있습니다. 그러한 작업을 위해 나는 종종 antlr을 사용합니다 (http://www.antlr.org) 파이썬 코드 생성기가 있습니다. Antlr은 Lexer 레벨에서 많은 입력을 먹는 것과 같은 일을하는 데 많은 트릭을 가지고 있으므로 파서는 결코 더 큰 문법 (예 : 댓글)을 보지 못하고 (예 : 주석), 하위 규칙 (예 : 방정식)을 호출 할 수있는 능력 (예 : 일단 끝나면 종료해야합니다. 더 이상 입력을 처리하지 않고 규칙이 일치했습니다 ... 원하는 것과 비슷한 소리)와 매우 멋진 좌심 요소 알고리즘.

stringtemplate의 사용과 결합 된 Antlrs 구문 분석 기능 (http://www.stringtemplate.org) 엔진은 좋은 조합을 만들고 둘 다 파이썬을 지원합니다 (많은 것 중에서도).

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