2014-04-18 5 views

답변

5

창조주 것이다.

checkName = { MATCHES_IGNORE_CASE(LS(1), @"check") }? Word Word; 

일부 설명 :

  • 의미 술어는 기능입니다

    현재이 작업을 수행 할 수있는 유일한 방법은 라운드에 대한 종류의 방법으로 의미 술어을 사용하는 것입니다 ANTLR에서 직접 들어왔다. Semantic Predicate 부분은 { ... }?입니다. 문법 규칙의 어느 곳에 나 배치 할 수 있습니다. 부울 값으로 평가되는 return 문으로 끝나는 단일 표현식이나 일련의 명령문을 포함해야합니다. 이것은 하나의 표현식을 포함합니다. 표현식이 이면으로 평가되는 경우 현재 규칙 (이 경우 checkName)이 일치하면 이됩니다. 의 값이이면 일치가 진행됩니다.

  • MATCHES_IGNORE_CASE(str, regexPattern)은 정규 표현식을 수행하기 위해 조건부 및 동작에 사용하기 위해 정의한 편의 매크로입니다. 대소 문자를 구분하는 친구가 있습니다 (MATCHES(str, regexPattern)). 두 번째 인수는 NSString* 정규식 패턴입니다. 의미가 분명해야합니다.

  • LS(num)은 프레디 케이트/액션에서 사용하기에 편리한 또 다른 매크로입니다. Lookahead String을 가져 오는 것을 의미하며 인수는 미리보기까지의 거리를 지정합니다. 따라서 LS(1)은 미리보기 의미는 1입니다. 즉, "파서가 일치하려고 시도 할 첫 번째 예정된 토큰의 문자열 값을 가져옵니다".

  • 나는 여전히 Word두 번과 일치한다는 것을 알 수 있습니다. 첫 번째 Word은 '확인'과 일치하기 위해 필요합니다 (이미 으로 테스트되었지만은 일치하지 않고 인 입니다). 두 번째 Wordname 또는 무엇이든 사용할 수 있습니다.

희망이 있습니다.

+0

정확하게 이해할 수 있는지 확인하기 위해 공백을 검사 할 때 조건부가 유효성을 판단 할 때 사용합니다. 그래서 나는 그것이 술어가 통과하고 첫번째 단어가 술어 정규식과 일치하는 규칙과 일치한다면 가정하는 것이 안전하다. – utahwithak

+0

기본적으로 그렇습니다. 엄밀히 말하면'Word' ref 만 실제로 'check'단어 입력과 일치합니다 **. 그러나 Predicate가 쓰러지면'Word' 참조 일치가 실패 할 수 없습니다. 실제적으로 말하자면, 술어는 ** 실제 인식 작업을 수행하고 있습니다 **. 그러나'Word' ref는 ** match를 수행하고 토큰을 소비해야합니다 **. –

관련 문제