2010-03-09 4 views
0

나는 간단한 문법 설정과 같이이 있습니다나무 꼭대기 문법 문제

 
grammar Test 
    rule line 
     (adjective/not_adjective)* { 
     def content 
      elements.map{|e| e.content } 
     end 
     } 
    end 
    rule adjective 
     ("good"/"bad"/"excellent") { 
      def content 
       [:adjective, text_value] 
      end 
     } 
    end 
    rule not_adjective 
     !adjective { 
      def content 
       [:not_adjective, text_value] 
      end 
     } 
    end 
end 

의 내 입력이 있다고 가정 해 봅시다 "이 좋은 볼이다의 그것을 사용하자.". 이것은 오류를 제공합니다. 왜냐하면 제가 왜 잘못되었는지에 대한 이론을 이해하기 원하기 때문에 지금 언급하지는 않습니다. 그래서 not_adjective 규칙을 만들어 규칙 형용사와 일치하지 않는 규칙과 어떻게 일치 시키나요? 일반적으로, 내가 "다른"명명 규칙과 "일치하지 않는"규칙 (특히 Treetop에서)을 작성하는 방법은 무엇입니까?

답변

1

Treetop은 Parsing Expression Grammars or PEG이라는 특수한 문법 클래스에서 파서를 생성하는 parser generator입니다.
!expression의 작동 해석은 expression이 실패하고 expression이 성공하면 성공하지만 은 NO 입력을 소비합니다. 이전 대답은 영업 이익의에 대한 잘못된

(!expression .)* ie. "match anything BUT expression" 
1

:
expression 특정 "단어를"방지하기 위해 부정 연산자와 함께 (즉, 아무것도 일치)가 연산자를 사용하여 일치하지 않는 지배 무엇을 일치 시키려면 질문, 어떤 형용사까지 개별 문자의 모든 순서와 일치하므로. 따라서 문자열 xyzgood를 보면 xyz와 일치하고 다음 규칙은 "좋은"부분을 형용사와 일치시킵니다. 마찬가지로 OP의 형용사 규칙은 "badge"의 처음 세 문자와 형용사 "bad"를 매칭합니다. 이 같은

rule adjective 
    a:("good"/"bad"/"excellent") ![a-z] { 
    def content 
     [:adjective, a.text_value] 
    end 
    } 
end 

과 not_adjective 규칙 :

rule not_adjective 
    !adjective w:([a-z]+) { 
    def content 
     [:not_adjective, w.text_value] 
    end 
    } 
end 

가로 등 대문자, 하이픈, 아포스트로피에 대한 처리를 포함

대신, 형용사 규칙은 다음과 같이 보일 것이다 필요한. 물론 화이트 스페이스 처리가 필요합니다.