YACC가 아닌 LEX에서 오류 조건을 처리합니까?
-
16-09-2019 - |
문제
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 규칙이 문법으로 돌아 오는 것을 제어합니다. 이것은 키워드를 식별자와 구별하는 한 가지 방법입니다.
실제로 진행되는 일에 맞게 정규 표현을 일반화하고 단순화하십시오.
제휴하지 않습니다 StackOverflow