2010-01-19 3 views
30

PHP에 Lex와 Yacc의 구현이 있습니까?PHP의 Lex와 Yacc

그렇지 않다면 누구든지 lexical analyzer와 parser generator (즉, Lex와 Yacc와 같은 것)가 PHP 코드를 생성 할 것을 제안 할 수 있습니까? 필자는 결과 파서의 성능에 대해 너무 걱정하지 않는다. 정말 정규식으로 해석해서는 안 일을 구문 분석 할 정규식을 사용하는 병입니다

...

+0

@nickf 그래도 당연 하네! – Christian

+0

+1'preg_split ('# ([{})) #', ...)'지금까지만 당신을 얻을 수 있습니다. – Dan

+0

언어가 PHP와 동일한 토큰을 사용하는 경우 buil-in PHP 토큰 화 프로그램을 사용할 수 있습니다 – niahoo

답변

1

잠시 동안 이런 종류의 것을 찾고있었습니다. 이 게시물을 찾은 후 ANTLR PHP 런타임을 사용해 보았습니다. 나는 그것이 끝나지 않았다고보고 할 수 있습니다. 생성 된 코드에는 원래 Java 런타임 클래스가 PHP (중첩 클래스 선언, 클래스 메소드 연산자에 액세스하려고 할 때 '.'대신 '.'대신에)를 사용하여 제대로 변환되지 않은 몇 가지 오류가 있습니다.

ANTLR 프레임 워크 자체는 매우 강력합니다 (생성 된 코드의 효율성을 증명할 수는 없습니다). 특히 그래픽 도구 ANTLRWorks를 사용하면 쉽게 문법을 만들고 디버깅 할 수 있습니다. PHP 버전에 대해서는 너무 나쁘다. 자신의 것을 굴릴 수도 있습니다. 가장 좋은 해결책은 생성 된 ANTLR 런타임 클래스를 분석하고, 그것이 어떻게 작동하는지 파악하고, 덜 가벼운 enterprisey 버전을 제안하는 것입니다.

0

에게 또 다른 sugestion 참조 : 렉스/Yacc에 접근을 방지, 좋은 string 파서로 PHP를 사용

  • 간단한 작업 간단한 번역에 대한 : 사용 펄 정규 표현식 (PCRE)로 PHP preg_* functions. 콜백은 Awk 또는 Yacc 규칙과 동등하지만 PHP 코드 (!)를 사용합니다. 복잡한 작업에 대한

  • : 번역 XML 방언, process with DOM 및/또는 XSLT에 해당 언어 (PHP는 문자열이나 PCRE 번역기 또는 다른 번역기와 함께). XSLT는 Yacc와 같이 "규칙 지향적"(se xsl : template)입니다. XSLT에서는 access to PHP functions with registerphpfunctions()도 있습니다. 비 XML 언어 또는 I/O 복합 형식으로 다시 되돌아 가려면 PCRE 및 문자열 함수를 사용하여 출력 (a saved XML 또는 XSLT 출력)을 다시 처리하십시오.

    • 추 신 : 더 풍부하고 복잡한 언어의 경우 "XML로 번역"작업이 가능하지만 항상 쉬운 것은 아닙니다 (xSugar theory 참조). PHP-PEG을 사용하여 PHP로 번역하거나 with a external tool을 번역하여 XML을 캐시하거나 특정 언어 스크립트의 permanent-xml-translated 버전을 사용할 수 있습니다.

이 두 옵션 은 (렉스와 Yacc에) 동일한 전력을 가지고 있고, 구축 된 PHP의 클래스와 함수만을 사용합니다.

복잡한 경우 XML, XSLT 등은 W3C 표준이며 XML 표준은 "표준 형식"이며 XML 도구는 최적화되어 있으며 진화 중이고 XML 데이터는 서로 바꿔 사용할 수 있습니다.