문제

나는 루비의 트리톱 문법 생성기를 가르치려고 노력하고 있습니다. 나는 문서가 "가장 좋은"것에 대해 문서가 드문 드문 일뿐 만 아니라, 내가 기대했던 것처럼 직관적으로 작동하지 않는 것 같습니다.

높은 수준에서, 나는 현장 문서 나 비디오가 있다면 더 나은 튜토리얼을 좋아할 것입니다.

더 낮은 수준에서는 여기에 전혀 일할 수없는 문법이 있습니다.

grammar SimpleTest

  rule num
    (float / integer)
  end

  rule float
   (
    (( '+' / '-')? plain_digits '.' plain_digits) /
    (( '+' / '-')? plain_digits ('E' / 'e') plain_digits ) /
    (( '+' / '-')? plain_digits '.') / 
    (( '+' / '-')? '.' plain_digits) 
   ) {
      def eval
        text_value.to_f
      end
   }
  end

  rule integer
    (( '+' / '-' )? plain_digits) {
      def eval
        text_value.to_i
      end
    }
  end

  rule plain_digits
    [0-9] [0-9]*      
  end

end

그것을로드하고 매우 간단한 테스트 객체에서 몇 가지 어설 션을 실행하면 다음을 발견합니다.

assert_equal @parser.parse('3.14').eval,3.14

잘 작동합니다

assert_equal @parser.parse('3').eval,3

오류가 발생합니다 : nomethoderror : private method`at eval '이라는 #

정수를 반전시키고 설명에 부유하면 정수와 부유물 모두이 오류를 제공합니다. 나는 이것이 제한된 전망대와 관련이 있다고 생각하지만, "또는"컨텍스트에서 평가하는 아이디어를 다루기 위해 문서에서 어떤 정보도 찾을 수 없습니다.

도움이 될 수있는 좀 더 많은 정보. 다음은 두 파라 () 블록 모두에 대한 PP 정보입니다.

플로트 :

SyntaxNode+Float4+Float0 offset=0, "3.14" (eval,plain_digits):
  SyntaxNode offset=0, ""
  SyntaxNode+PlainDigits0 offset=0, "3":
    SyntaxNode offset=0, "3"
    SyntaxNode offset=1, ""
  SyntaxNode offset=1, "."
  SyntaxNode+PlainDigits0 offset=2, "14":
    SyntaxNode offset=2, "1"
    SyntaxNode offset=3, "4":
      SyntaxNode offset=3, "4"

정수 ... 정수 규칙을 따르는 것으로 정의 된 것으로 보이지만 eval () 메소드를 찾지 못했습니다.

SyntaxNode+Integer0 offset=0, "3" (plain_digits):
  SyntaxNode offset=0, ""
  SyntaxNode+PlainDigits0 offset=0, "3":
    SyntaxNode offset=0, "3"
    SyntaxNode offset=1, ""

업데이트:

특별한 문제가 발생했지만 그 이유는 없습니다.

  rule integer
    ( '+' / '-' )? plain_digits
     {
      def eval
        text_value.to_i
      end
    }
  end

이것은 존재하는 문서에서는 의미가 없지만 추가 괄호를 제거하면 일치하는 integer1 클래스와 integer0이 포함됩니다. integer1은 분명히 Eval () 메소드를 보유하는 클래스입니다. 왜 이것이 사실인지 모르겠습니다.

나는 아직도 Treetop에 대한 더 많은 정보를 찾고 있습니다.

도움이 되었습니까?

해결책

슬프게도, Treetop의 문서는 짜증납니다. 많이. 웹 사이트의 예제는 도움이되지 않습니다. 나는 Dzone에 꽤 많은 Treetop 문법 모음이 있다는 것을 알았습니다.

트리톱 문법

다른 팁

Paul Batty의 멋지고 간단한 튜토리얼에 감사 할 것입니다.Treetop을 시작합니다

최소한의 문법으로 시작하여, 그는 파서를 만드는 방법을 보여준 다음 몇 가지 반복을 통해 약간의 기능 만 추가됩니다. 나를 시작 블록에서 꺼내는 것만으로도 충분했습니다.

Roland Swingler는 Treetop에서 Lrug에게 프레젠테이션을했습니다.http://skillsmatter.com/podcast/ajax-ria/treetop나는 유용한 시작을 발견했다.

감귤류는 Treetop에 대한 훨씬 가벼운 대안입니다. http://github.com/mjijackson/citrus

나는 이것을 따랐다 Treetop 입문 튜토리얼 몇 년 전 Treetop의 기본 사항을 이해하기 위해.

그리고 Treetop으로 파서를 쓰는 빠른 소개, 구문 트리 노드를 루비 클래스 인스턴스에 매핑하는 방법을 설명했기 때문에 나에게 유용합니다.

방금 Treetop을 실험하기 시작했습니다.

나는 변화를 시도했다

 rule num
      (float / integer)
 end

에게

 rule num
      (float / integer)
      {
       def eval
            text_value.to_f
       end
      }
 end

그리고 그것은 작동하는 것 같습니다.

Treetop 문서는 이미 상당한 금액을 알고 있다고 가정합니다. 표현 문법을 구문 분석합니다 (페그). Treetop은 전적으로 페그를 기반으로합니다. 페그는 단순한 트리 탑보다 큽니다. 즉, 다른 구문 분석 라이브러리에서도 사용됩니다. Treetop을 배우면서, 나는 일반적으로 페그를 연구하는 것이 매우 도움이된다는 것을 알았습니다. 그것은 문서의 많은 격차를 메우는 데 도움이되었습니다.

이것은 버그입니다. 정수에 대한 규칙 주변의 불필요한 괄호는 추가 모듈의 Eval 정의를 포함하도록 유발 하며이 모듈은 노드에 혼합되지 않으므로 'Eval'을 사용할 수 없습니다. 추가 괄호가 있거나없는 버전에 대해 루비 코드 (TT 명령을 사용하여 생성)를 비교하면이를 명확하게 볼 수 있습니다.

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