문제

애완동물 프로젝트로서 웹 스크립팅 언어로 사용할 수 있는 자체 디자인의 기본 언어를 구현해 보고 싶습니다.C++ 프로그램을 Apache CGI로 실행하는 것은 쉽지 않으므로 실제 작업은 비코드(HTML/CSS 마크업) 및 서버측 코드가 포함된 입력 파일을 구문 분석하는 방법에 있습니다.

학부생 컴파일러 과정에서 우리는 몸을 풀다 그리고 바이슨 간단한 언어에 대한 스캐너와 파서를 생성합니다.우리는 문법 사본을 받고 간단한 언어를 가상 머신용 간단한 어셈블리로 번역하는 파서를 작성했습니다.Flex 스캐너는 입력을 토큰화하고 토큰을 Bison 파서에 전달합니다.

그것과 내가 하고 싶은 것의 차이점은 PHP처럼 이 언어도 일반 HTML 마크업과 다음과 같이 배치된 스크립팅 언어를 가질 수 있다는 것입니다.

<p>Hello,
<? echo "World ?>
</p>

다음과 같이 입력 파일을 구문 분석하는 것이 효율적이라고 가정하는 것이 잘못되었습니다.

  1. 스크립트 시작 태그를 찾을 때까지 입력을 검색합니다('
  2. 두 번째 스캐너는 입력 파일의 서버 측 스크립트 섹션을 토큰화합니다(열린 태그에서:'') 파일의 마크업에 대해 알 필요가 없는 파서에 토큰을 전달합니다.
  3. 이 일반적인 패턴을 계속하는 첫 번째 스캐너로 제어권이 반환됩니다.

기본적으로 첫 번째 스캐너는 수정되지 않은 상태로 브라우저에 직접 반환되는 마크업과 두 번째 스캐너로 전달되는 코드만 구별합니다. 두 번째 스캐너는 코드를 토큰화하고 토큰을 파서에 전달합니다.

이것이라면 ~ 아니다 견고한 디자인 패턴을 갖고 있는 경우 PHP와 같은 언어는 입력 검색 및 코드 구문 분석을 어떻게 효율적으로 처리합니까?

도움이 되었습니까?

해결책

시작 조건을 보고 싶습니다.예를 들어:

"<?"            { BEGIN (PHP); }
<PHP>[a-zA-Z]*  { return PHP_TOKEN; }
<PHP>">?"       { BEGIN (0); }
[a-zA-Z]*       { return HTML_TOKEN; }

상태 0에서 시작하고 BEGIN 매크로를 사용하여 상태를 변경합니다.특정 상태에 있는 동안에만 RE를 일치시키려면 RE 앞에 꺾쇠 괄호로 묶인 상태 이름을 붙입니다.

위의 예에서 "PHP"는 상태입니다."PHP_TOKEN" 및 "HTML_TOKEN"은 yacc 파일에 의해 정의된 _%token_s입니다.

다른 팁

PHP는 스캐닝과 마크업을 구별하지 않습니다.마크업 모드에서는 단순히 버퍼로 출력하고, 코드 모드에서는 구문 분석으로 전환합니다.2단계 스캐너가 필요하지 않으며 단 하나의 Flex Lexer만으로 이 작업을 수행할 수 있습니다.

PHP 자체의 작동 방식에 관심이 있다면 소스를 다운로드하세요(PHP4 소스를 사용해 보면 이해하기가 훨씬 쉽습니다).보고 싶은 것은 Zend Directory에 있습니다. zend_language_scanner.l.

나 자신과 비슷한 글을 썼기 때문에 Flex와 Bison 경로를 다시 생각해 보고 다음과 같은 현대적인 방법을 사용하는 것이 좋습니다. 앤틀러.훨씬 쉽고 이해하기 쉬우며(lex 문법에 사용된 매크로는 매우 혼란스럽고 읽기 어렵습니다) 디버거가 내장되어 있습니다(AntlrWorks) 따라서 3Meg 디버그 파일을 찾는 데 몇 시간을 소비할 필요가 없습니다.또한 다양한 언어(Java, c#, C, Python, Actionscript)를 지원하며, 훌륭한 책과 훌륭한 웹사이트를 갖추고 있어 즉시 시작하고 실행할 수 있습니다.

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