2012-04-22 2 views
0

플렉스의 기본 동작을 사용자 정의하려면 어떻게합니까? 나는 < * 같은 것을 발견했다. 그러나 나는 그것을 실행 할 때 "플렉스 스캐너가 끼어있다"고 말하고 있는가? 또한. 규칙은 규칙을 추가하기 만하므로 작동하지 않습니다. 내가 원하는 것은플렉스 기본 규칙

comment    "/*"[^"*/"]*"*/" 

%% 
{comment}    return 1; 
{default}    return 0; 
<<EOF>>    return -1; 

일치하는 동작을 가장 먼저 일치하도록 변경할 수 있습니까? 그렇다면 나는 이런 식으로 할 것입니다.

그러나 이것은 거의 항상 더 긴 일치를 제공하기 때문에 주석 규칙을 숨길 것입니다.

편집

내가 발견

{-} 바로 매뉴얼에서 수동 연산자 그러나이 예는 나에게 "unrecogized 규칙"제공 : {-} [BZ]

답변

4

플렉스 기본 규칙은 단일 문자를 일치시키고 표준 출력에 인쇄합니다. 그 행동을 원하지 않는다면, 한 글자와 일치하고 다른 것을하는 명시적인 규칙을 작성하십시오.

패턴 (.|\n)*은 전체 입력 파일을 단일 토큰으로 일치하므로 매우 나쁜 생각입니다. 기본값은 길게 일치해야한다고 생각하고 있지만 실제로는 가능한 한 짧게하고 싶지만 (비어있는 것은 아님)

입력 규칙에 일치하는 토큰이 없을 때 기본 규칙의 용도가 있습니다. lex가 언어 토큰 화에 사용될 때, 그러한 상황은 입력이 언어의 유효한 토큰의 시작이 아닌 문자로 시작된다는 것을 의미하기 때문에 거의 항상 잘못된 것입니다.

따라서 "catch any character"규칙은 오류 복구 형식으로 코딩됩니다. 생각은 나쁜 성격 (단 하나)을 버리고 그 성격 뒤의 토큰 화를 시도하는 것입니다. 이는 단지 추측 일 뿐이지 만 알려진 것이기 때문에 좋은 추측입니다. 즉 입력에 나쁜 문자가 하나 있다는 것입니다.

복구 규칙이 잘못되었을 수 있습니다. 예를 들어 언어 토큰이 @으로 시작하지 않고 프로그래머가 문자열 리터럴 "@abc"을 작성하려고한다고 가정합니다. 단, 그녀는 오프닝 "을 잊어 버리고 @abc"이라고 썼습니다. 올바른 픽스는 누락 된 코드를 삽입하는 것입니다. @을 버리지 말고, "을 삽입하십시오. 그러나 그것은 렉서에서 훨씬 더 영리한 규칙들을 필요로 할 것입니다.

어쨌든 일반적으로 잘못된 문자를 삭제할 때 "42 행 3 열의"잘못된 문자 건너 뛰기 "~"와 같은 오류 메시지를 보내려합니다.

일치하지 않는 문자를 표준 출력으로 복사하는 기본 규칙/동작은 lex가 텍스트 필터링에 사용될 때 유용합니다. 그런 다음 기본 규칙은 정규 표현식 검색과는 반대로 정규식 검색의 의미를 나타냅니다. 즉, 입력은 렉서 토큰 인식 상태 시스템의 일치 항목을 검색하고 해당 검색에서 건너 뛴 모든 자료를 인쇄하는 것입니다. 그래서 예를 들어

, 단지 규칙이 포함 된 렉스 사양 :

"foo" { printf("bar"); } 

내가 문제를 해결하는 대신 수동으로하는 경우 규칙의 보완을 일치하려고

sed -e 's/foo/bar/g' 
1

[AC]를

그런 건 없어요. 이것은 XY problem처럼 의심 스럽습니다. flex의 기본 동작 (Y)을 사용자 정의하는 방법을 묻지 만 실제로는 다른 끝 X를 얻고 싶습니다.

X가 무엇입니까?

Re : 귀하의 질문에 왜 "." 트릭을하지 않습니까? 일치하는 금액이 없을 경우 작업을 수행 할 수 없으므로 요청한 질문은 의미가 없습니다. flex는 일치가 없으면 아무 것도하지 않으므로 "기본"규칙을 추가하려면 그냥 일치 시키십시오.

0

에 해당 구현됩니다 . 이 경우에는 일치하는 패턴이 매우 간단하기 때문에 정상적으로 작동합니다.