lex 예제

다음은 파스칼과 같은 구문에 대한 기본 스캐너를 구현하는 lex 프로그램의 예입니다: 몇 가지 예는 사양보다 이 언어를 더 잘 비춥시됩니다: 다음 예제는 calc.yacc 파일의 내용을 보여 주십습니다. 이 파일에는 yacc 문법 파일의 세 섹션(선언, 규칙 및 프로그램)에 대한 항목이 있습니다. 다음 설명에서는 calc.lex 및 calc.yacc 예제 프로그램이 현재 디렉터리에서 찾을 수 있다고 가정합니다. 일반적인 ERE 규칙과 달리 임베디드 앵커링은 대부분의 기록적인 lex 구현에서 허용되지 않습니다. 포함된 앵커링의 예는 완전한 단어로 존재할 때 foo와 일치하는 (^)foo($)와 같은 패턴에 대한 것입니다. 이 기능은 기존 lex 기능을 사용하여 얻을 수 있습니다. 예를 들어 이 예제는 그 자체로는 별로 유용하지 않았으며 다음 예제도 마찬가지입니다. 그러나 나중에 대단히 유용한 Lex에서 정규식을 사용하는 방법을 보여줍니다. lex 유틸리티는 렉스 소스 코드 또는 생성된 어휘 분석기에서 정규식의 처리에서 완전히 국제화되지 않습니다. 어휘 분석기는 어휘 분석기실행 시 지정된 환경에 따라 어휘 소스에 주어진 정규식을 해석하는 것이 바람직해 보이지만 현재의 lex 기술로는 불가능합니다. 또한 lex에 의해 생성된 어휘 분석기의 본질은 설명되는 입력 언어의 어휘 요구 사항과 밀접하게 연관되어야 하며, 이는 종종 로캘에 따라 다릅니다. 예를 들어 프랑스어 텍스트에 사용되는 분석기를 작성하는 것은 다른 언어를 처리하는 데 자동으로 유용하지 않습니다.

그러면 파일 `example1`이 생성됩니다. 실행하면 일부 입력을 입력할 때까지 기다립니다. 정의 된 키 (즉, `stop`및 `start`)와 일치하지 않는 것을 입력 할 때마다 다시 출력됩니다. `중지`를 입력하면 `수신 중지 명령`이 출력됩니다. 다음 예제에서는 lex 정규식과 이 문서의 다른 위치에 나타나는 정규식 간의 차이점을 명확히 합니다. r/x 형식의 정규식의 경우 r과 일치하는 문자열이 항상 반환됩니다. x의 시작부분이 r의 후행 부분과 일치할 때 혼동이 발생할 수 있습니다. 예를 들어 정규식 a*b/cc와 입력 aaabcc이 주어지면 yytext에는 이 일치의 문자열 aaab이 포함됩니다.

그러나 정규식 x */xy 및 입력 xxxy를 감안할 때 xxx가 아닌 토큰 xxx는 xxx가 x *와 일치하기 때문에 일부 구현에서 반환됩니다. 학생 이름, 학교 이름, 그룹 이름 및 모듈 이름에 대해 작성한 규칙이 모두 매우 유사하기 때문에 각 규칙이 예상되는 것만 선택할 수 있다고 확신하기 위해 잠시 멈춰야 합니다. (파우스트 DFSA 언어에 대해 이 작업을 수행할 필요가 없습니다. 구별하기 쉽도록 다른 토큰을 의도적으로 선택했기 때문에.) 이 예제에서는 각 토큰이 [A-Z]로 시작하지만 두 번째 또는 세 번째 문자는 대부분의 문자를 구분하기에 충분해 보입니다(예: 그룹은 2번째 문자로 숫자를 가지는 반면 다른 문자는 문자가 있습니다). 계산기 예제가 없으면 lex에 대한 소개가 완료되지 않습니다. 예를 들어 코드 def f(x): 반환 3의 경우 생성된 S-표현식은 다음과 같습니다.

カテゴリー: 未分類   パーマリンク

コメントは受け付けていません。