2012-10-20 4 views
2

나는 다음과 같은 나무 꼭대기 문법이 : 나는 식을 구문 분석 할 때나무 꼭대기 무한 재귀가

grammar TestGrammar 

    rule body 
     text/expression 
    end 

    rule text 
     not_delimiter* 
    end 

    rule expression 
     delimiter text delimiter 
    end 

    rule delimiter 
     '$' 
    end 

    rule not_delimiter 
     !delimiter 
    end 

end 

를, 예를 들어 '안녕하세요 세계 $ 테스트 $'는 스크립트가 무한 루프에 간다.
문제는 not_delimiter 규칙에서 오는 것처럼 보입니다. not_delimiter 규칙을 제거하면 표현식이 파싱됩니다.

이 문법의 문제점은 무엇입니까?

미리 감사드립니다.

+0

, 당신은'not_delimiter'을 제거 출력은 무엇인가? 또한이 문자열을 구문 분석해야하는 이유는 무엇입니까? "hello world $ test $"는 텍스트 ($가 아닌 시퀀스) 나 표현식 ($로 시작하고 끝나는 텍스트)이 아닙니다. –

답변

1

문제는 당신이 일치하려는 경우 것 같다 다음 * 이후

rule text 
    not_delimiter* 
end 

또한 내가 무한 루프의 원인이 무엇이라고 생각 [^$]*를 일치의 가능성이 전혀 일치하지 않습니다.

또한, 당신은 이제까지 text 규칙 또는 expression 규칙 중 하나만 일치하기 때문에 그렇지 않으면, nil를 반환합니다, 시작 규칙에 여러 bodies 일치해야합니다.

rule bodies 
    body+ 
end 

이 구문 분석됩니다

는 예상 출력 기능
require 'treetop' 
Treetop.load_from_string DATA.read 

parser = TestGrammarParser.new 

p parser.parse "hello world $test$" 

__END__ 
grammar TestGrammar 
    rule bodies 
     body+ 
    end 
    rule body 
     expression/text 
    end 
    rule expression 
     delimiter text delimiter 
    end 
    rule text 
     not_delimiter+ 
    end 
    rule not_delimiter 
     [^$] 
    end 
    rule delimiter 
     '$' 
    end 
end 
+0

감사! 실제로, 그것은 의미가 있습니다. 나는 정말로 treetop이 더 좋은 문서화와 오류 출력을 원한다면, 디버깅이 때로는 번거로울 수 있기를 바란다. – Eric