문제

나는 사용 lex 및 yacc(더 일반적으로 들)과거에는 다양한 프로젝트 일반적으로 번역(예:하위 집합의 EDIF 스트리밍으로 EDA)응용 프로그램입니다.또한,나는 지원에 따라 코드 렉스/yacc 문법이다.그래서 나는 내 주위에 방법이 도구지만,나는 아무 전문가입니다.

본에 대해 긍정적인 의견 Antlr 에서 다양한 포럼에서는,과거와 저는 호기심을 내가 누락 될 수 있습니다.그래서 만약 당신이 사용하십시오게 더 이상 고급 Antlr.현재 제약 조건 하에서는 C++상점,그리고 어떤 제품든지 우리는 우주선이 포함되지 않습 Java 므로 결과 파서를 따라야 하는 규칙이 있습니다.

도움이 되었습니까?

해결책

업데이트/warning:이 대답할 수 있다!


하나의 주요 차이점은 ANTLR 생성하는 LL(*)파서는 반면,YACC 들소를 모두 생성하는 파서는 LALR.이것은 중요한 구별 다수의 애플리케이션을 위해 가장 눈에 띄는 사업자:

expr ::= expr '+' expr
       | expr '-' expr
       | '(' expr ')'
       | NUM ;

ANTLR 은 완전히 처리할 수 없이 문법입니다.사용 ANTLR(또는 다른 LL 파서 생성기)를,필요로 변환하 이 문법을 이해할 수 있게 무언가를하지 않는 좌 재귀적입니다.그러나 들소에 문제가 없 문법의 형태입니다.당신이 필요하 선언'+'및'-'로 왼쪽 연결형 연산자,하지만 반드시 필요한 것은 아닙 왼쪽 재귀.더 나을 수 있습니다 예를 들어 파견:

expr ::= expr '.' ID '(' actuals ')' ;

actuals ::= actuals ',' expr | expr ;

통보는 모두 expractuals 규칙은 왼쪽 재귀적입니다.이것은 훨씬 더 많은 효율적인 AST 을 때 코드를 생성해야 할 필요성을 피할 수 있기 때문에 여러 레지스터하고 불필요한 흘리(왼쪽으로 기울어 트리 축소할 수 있습니다면 오른 기대어 나무 수 없).

의 측면에서 개인적인 생각하는 LALR 문법은 훨씬 쉽게 구성하고 디버그.단점은 거래를 할 수 있 다소한 오류는 다음과 같 shift-을 줄이고(포)을 줄이-줄일 수 있습니다.이러한 오류를 들소를 잡는 경우를 생성하는 파서,그래서 그것에 영향을 미치지 않는 최종 사용자 환경,그러나 그것을 만들 수 있는 개발 프로세스 비트가 더 흥미 롭습니다.ANTLR 일반적으로 사용하는 것이 더 쉽다 YACC/소를 정확하게 이 이유입니다.

다른 팁

YACC/Bison과 Antlr의 가장 중요한 차이점은이 도구가 처리 할 수있는 문법의 유형입니다. YACC/Bison 손잡이 LALR 문법, antlr 핸들 LL 문법.

종종 Lalr 문법과 함께 오랫동안 일한 사람들은 LL 문법과 함께 일하는 것이 더 어려워지고 그 반대도 마찬가지입니다. 그렇다고 문법이나 도구가 본질적으로 작업하기가 더 어렵다는 것을 의미하지는 않습니다. 사용하기 쉬운 도구는 대부분 문법 유형에 익숙해집니다.

장점이있는 한, LALR 문법이 LL 문법에 대한 장점을 가지고 있으며 LL 문법이 LALR 문법에 비해 장점이있는 다른 측면이 있습니다.

YACC/Bison 생성 테이블 구동 파서는 "처리 로직"이 파서의 코드에 그리 많지 않은 파서 프로그램의 데이터에 포함되어 있음을 의미합니다. 지불 오프는 매우 복잡한 언어의 파서조차도 비교적 작은 코드 발자국을 가지고 있다는 것입니다. 이것은 하드웨어가 매우 제한적인 1960 년대와 1970 년대에 더 중요했습니다. 테이블 구동 파서 생성기는이 시대로 돌아가고 작은 코드 발자국은 당시 주요 요구 사항이었습니다.

ANTLR은 재귀 하강 파서를 생성합니다. 즉, 문법의 각 생산 규칙은 파서 코드의 함수로 표시되므로 "처리 로직"이 파서 코드에 포함되어 있음을 의미합니다. 지불 오프는 코드를 읽음으로써 파서가 무엇을하고 있는지 이해하는 것이 더 쉽다는 것입니다. 또한 재귀 하강 파서는 일반적으로 테이블 구동 파서보다 빠릅니다. 그러나 매우 복잡한 언어의 경우 코드 풋 프린트가 더 커집니다. 이것은 1960 년대와 1970 년대의 문제였습니다. 당시에는 하드웨어 제한으로 인해 Pascal과 같은 상대적으로 작은 언어 만 이러한 방식으로 구현되었습니다.

Antlr 생성 된 파서는 일반적으로 10.000 줄의 코드 등에 있습니다. 필기 재귀 하강 파서는 종종 같은 야구장에 있습니다. Wirth의 Oberon Compiler는 아마도 코드 생성을 포함하여 약 4000 줄의 코드를 가진 가장 작을 수 있지만 Oberon은 약 40 개의 프로덕션 규칙을 가진 매우 컴팩트 한 언어입니다.

누군가가 이미 지적했듯이, Antlr의 큰 장점은 antlrworks라는 그래픽 IDE 도구입니다. 완전한 문법 및 언어 설계 실험실입니다. 문법 규칙을 입력 할 때 문법 규칙을 시각화하고 충돌을 발견하면 충돌이 무엇인지, 그리고 원인이 무엇인지 그래픽으로 보여줍니다. 왼쪽 추방과 같은 충돌을 자동으로 리팩터링하고 해결할 수도 있습니다. 충돌이없는 문법이 있으면 antlrworks에 언어의 입력 파일을 구문 분석하고 구문 분석 트리를 만들고 IDE에서 나무를 그래픽으로 표시 할 수 있습니다. 이것은 많은 시간의 작업을 절약 할 수 있기 때문에 매우 큰 이점입니다. 코딩을 시작하기 전에 언어 설계에서 개념적 오류를 찾을 수 있습니다! LALR 문법을위한 그러한 도구를 찾지 못했습니다. 그러한 도구가없는 것 같습니다.

Parsers를 생성하고 싶지 않고 손으로 코드 코드를 만들지 않는 사람들에게도 Antlrworks는 언어 설계/프로토 타이핑을위한 훌륭한 도구입니다. 아마도 최고의 도구 일 것입니다. 불행히도, LALR 파서를 만들고 싶다면 도움이되지 않습니다. antlrworks를 활용하기 위해 LALR에서 LL로 전환하는 것은 가치가있을 수 있지만 일부 사람들의 경우 문법 유형을 바꾸는 것은 매우 고통스러운 경험이 될 수 있습니다. 다시 말해 : YMMV.

Antlr에 대한 몇 가지 장점 :

  • 다양한 언어로 구문 분석기를 출력 할 수 있습니다. 생성 된 파서를 실행할 필요가 없습니다.
  • Awesome GUI는 문법 디버깅을 쉽게 만듭니다 (예 : GUI에서 생성 된 AST의 권리를 볼 수 있습니다. 추가 도구가 필요하지 않음)
  • 생성 된 코드는 실제로 인간으로 읽을 수 있으며 (ANTLR의 목표 중 하나) LL 파서를 생성한다는 사실은 반드시 이와 관련하여 도움이됩니다.
  • 터미널의 정의는 컨텍스트가 없습니다 ((f) lex에서 Regex와 반대로). 터미널 적절하게 폐쇄 된 괄호를 포함합니다

내 .02 $

Antrl의 또 다른 장점은 사용할 수 있다는 것입니다 antlrworks, 다른 발전기에도 유사한 도구가있을 수 있기 때문에 이것이 엄격한 이점이라고 말할 수는 없습니다.

  • 들소와 플렉스는 더 작은 메모리 발자국을 초래하지만 그래픽 IDE는 없습니다.
  • Antlr은 더 많은 메모리를 사용하지만 그래픽 IDE 인 Antlrworks가 있습니다.

들소/플렉스 메모리 사용은 일반적으로 MBYTE입니다. Antlr-와 대조 - 구문 분석하려는 파일의 모든 토큰에 대해 512 바이트의 메모리를 사용한다고 가정합니다. 4 백만 개의 토큰과 32 비트 시스템의 가상 메모리가 없습니다.

구문 분석하려는 파일이 크면 antlr에 메모리가 부족할 수 있으므로 구성 파일을 구문 분석하려면 실행 가능한 솔루션이됩니다. 그렇지 않으면 많은 데이터가있는 파일을 구문 분석하려면 Bison을 사용해보십시오.

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