플렉스 기본 규칙은 단일 문자를 일치시키고 표준 출력에 인쇄합니다. 그 행동을 원하지 않는다면, 한 글자와 일치하고 다른 것을하는 명시적인 규칙을 작성하십시오.
패턴 (.|\n)*
은 전체 입력 파일을 단일 토큰으로 일치하므로 매우 나쁜 생각입니다. 기본값은 길게 일치해야한다고 생각하고 있지만 실제로는 가능한 한 짧게하고 싶지만 (비어있는 것은 아님)
입력 규칙에 일치하는 토큰이 없을 때 기본 규칙의 용도가 있습니다. lex가 언어 토큰 화에 사용될 때, 그러한 상황은 입력이 언어의 유효한 토큰의 시작이 아닌 문자로 시작된다는 것을 의미하기 때문에 거의 항상 잘못된 것입니다.
따라서 "catch any character"규칙은 오류 복구 형식으로 코딩됩니다. 생각은 나쁜 성격 (단 하나)을 버리고 그 성격 뒤의 토큰 화를 시도하는 것입니다. 이는 단지 추측 일 뿐이지 만 알려진 것이기 때문에 좋은 추측입니다. 즉 입력에 나쁜 문자가 하나 있다는 것입니다.
복구 규칙이 잘못되었을 수 있습니다. 예를 들어 언어 토큰이 @
으로 시작하지 않고 프로그래머가 문자열 리터럴 "@abc"
을 작성하려고한다고 가정합니다. 단, 그녀는 오프닝 "
을 잊어 버리고 @abc"
이라고 썼습니다. 올바른 픽스는 누락 된 코드를 삽입하는 것입니다. @
을 버리지 말고, "
을 삽입하십시오. 그러나 그것은 렉서에서 훨씬 더 영리한 규칙들을 필요로 할 것입니다.
어쨌든 일반적으로 잘못된 문자를 삭제할 때 "42 행 3 열의"잘못된 문자 건너 뛰기 "~"와 같은 오류 메시지를 보내려합니다.
일치하지 않는 문자를 표준 출력으로 복사하는 기본 규칙/동작은 lex가 텍스트 필터링에 사용될 때 유용합니다. 그런 다음 기본 규칙은 정규 표현식 검색과는 반대로 정규식 검색의 의미를 나타냅니다. 즉, 입력은 렉서 토큰 인식 상태 시스템의 일치 항목을 검색하고 해당 검색에서 건너 뛴 모든 자료를 인쇄하는 것입니다. 그래서 예를 들어
, 단지 규칙이 포함 된 렉스 사양 :
"foo" { printf("bar"); }
내가 문제를 해결하는 대신 수동으로하는 경우 규칙의 보완을 일치하려고
sed -e 's/foo/bar/g'
출처
2012-04-22 19:30:42
Kaz