2013-06-30 4 views
1

Antlr3에 대한 렉서 규칙을 만들려고합니다. 삼중 인용 문자열과 일치합니다. 예를 들어 :ANTLR3 렉서 규칙에서 다중 문자 제외를 정의하는 방법은 무엇입니까?

"""this is some text""" 

이 내가 그것을하고 있어요 방법은 다음과 같습니다

TEXT: 
    '"""' ('\\"' | ~'"')+ '"""' 
    { 
    this.setText(
     this.getText() 
     .substring(3, this.getText().length() - 3) 
     .replace("\\\"", "\"") 
    ); 
    } 
    ; 

잘 작동하지만 모든 작은 따옴표는 다음과 같이, 입력 텍스트에서 탈출해야합니다

:

"""this is the same text, but with \"escaped quotes\" inside""" 

나는 따옴표의 필수 이스케이프 처리를 제거하고 다음과 같이 트리플 인용 부호 사이에 아무 것도 (!) 구문 분석하려고합니다.

나는에 대한 규칙을 변경하기 위해 노력하고있어 573,977,

:

TEXT: 
    '"""' (~'"""')+ '"""' 

그리고 Antlr3 3.5 불평 :

error(100): Spec.g:153:13: syntax error: buildnfa: NoViableAltException([email protected][]) 
error(100): Spec.g:0:1: syntax error: buildnfa: MismatchedTreeNodeException(3!=29) 
error(100): Spec.g:0:: syntax error: buildnfa: NoViableAltException([email protected][]) 
error(100): Spec.g:0:1: syntax error: buildnfa: MismatchedTreeNodeException(29!=28) 
error(10): internal error: Spec.g : java.lang.NullPointerException 
org.antlr.tool.NFAFactory.build_Aplus(NFAFactory.java:516) 
... 

에 어떤 문제가 있습니까? 가능한 해결 방법은 무엇입니까?

+0

네가 맞아! 이것을 대답으로 바꾸면 받아 들일거야 – yegor256

+0

좋아, 끝났어. ..... –

답변

1

는 기본적으로 ungreedy 하고, 일을 단순히 시도?

+0

감사합니다, 매력처럼 작동합니다! – yegor256

1

가장 좋은 방법은 아마도 술어 일 것입니다.

TEXT 
    : '"""' 
    (~'"' 
    | {input.LA(2) != '"' || input.LA(3) != '"'}? '"' 
    )* 
    '"""' 
    ; 

이 ANTLR 4뿐만 아니라 당신이 input 술어에 _input에 변화에 따라만큼 작동합니다.

TEXT 
: '"""' .* '"""' 
    { 
    ... 
    } 
; 

: .*.+ 이후

+0

전체 입력이'' "'''로 시작하고''"'''로 끝나는 경우에만 작동합니다. 그렇지 않으면 텍스트가'(""hello "" ")'이면 예외가 발생합니다 :'TEXT failed TEXT : {input.LA (2)! = '"|| input.LA (3)! = ' "'}? ' – yegor256