문제

LEX 정규 표현이 있다고 가정 해 봅시다

[aA][0-9]{2,2}[pP][sS][nN]? { return TOKEN; }

사용자가 들어가는 경우

A75PsN
A75PS

일치합니다

그러나 사용자가 같은 말을한다면

A75PKN

나는 그것이 오류를 원하고 "캐릭터 k는 인식하지 못하고, 기대를 기대한다"고 말하고 싶습니다.

내가 지금하고있는 일은 그냥 쓰는 것입니다.

let [a-zA-Z]
num [0-9]

{let}{num}{2,2}{let}{2,3}

그리고 의미있는 오류 조건을 가질 수 있도록 YACC에서 문자열을 본질적으로 재구성합니다.

이 문제를 어떻게 해결할 수 있습니까?

내가 생각할 수있는 유일한 것은 명명 된 그룹을 사용하는 것입니까?

도움이 되었습니까?

해결책

우와! 흥미로운 계획.

어휘 분석기에서이를 감지하려면 '그렇지 않으면 인식되지 않은 문자열'을 다루고 오류 메시지를 생성하는 포괄적 인 규칙이 있어야합니다.

문제를 일으킨 것은 k라고 결정하는 것이 지옥이 될 것입니다.

[^aA][0-9]{2,2}[pP][sS][nN]? { report_error(); return ERROR; }
[aA][0-9]{2,2}[^pP][sS][nN]? { report_error(); return ERROR; }
[aA][0-9]{2,2}[pP][^sS][nN]? { report_error(); return ERROR; }
[aA][0-9]{2,2}[pP][sS][^nN]  { report_error(); return ERROR; }

케어의 배치와 물음표가 없음을 주목하십시오! 자발적이지 않거나 너무 많은 숫자 또는 너무 적은 자리를 다루는 것 - urgh!

일반적으로 모든 '식별자'를 인식하고 어떤 것이 괜찮은지 확인하는 것이 좋습니다.

[a-zA-Z][0-9]{2,2}[a-zA-Z]{2,5} { return validate_id_string(); }

유효성을 선택하십시오. 검증 루틴에 허용하는 것을 선택하십시오. 입력 한 내용이 괜찮은지 여부를 결정하며, 반환 값은 Lex 규칙이 문법으로 돌아 오는 것을 제어합니다. 이것은 키워드를 식별자와 구별하는 한 가지 방법입니다.

실제로 진행되는 일에 맞게 정규 표현을 일반화하고 단순화하십시오.

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