2017-01-13 18 views
2

두 가지 질문이 있습니다. 내가 보여주는 행동이 올바른지, 그렇다면 어딘가에 문서화되어 있습니까?.parse 앵커 또는 : sigspace를 Perl 6 규칙에서 먼저 사용합니까?

나는 문법 TOP 방법으로 놀고 있었다. rule로 선언, 그것은 :sigspace과 함께의 시작일과 끝 문자열 앵커 의미 : 없음 공백 또는 유일한 후행 공백을

grammar Number { 
    rule TOP { \d+ } 
    } 

my @strings = '137', '137 ', ' 137 '; 

for @strings -> $string { 
    my $result = Number.parse($string); 
    given $result { 
     when Match { put "<$string> worked!" } 
     when Any { put "<$string> failed!" } 
     } 
    } 

을, 문자열 구문 분석합니다. 선두 공백, 그것은 실패

<137> worked! 
<137 > worked! 
<137> failed! 

나는이 rule 먼저 :sigspace을 적용하는 것을 의미 파악하고 이후에 앵커 :

grammar Foo { 
    regex TOP {^:sigspace \d+ $ } 
    } 

내가 공백을 선도 허용하는 rule을 예상, 당신이 경우에 일어날 것

grammar Foo { 
    regex TOP { :sigspace^\d+ $ } 
    } 

내가 처음에 대한 rule에 명시 적으로 토큰을 추가 할 수 순서를 전환

grammar Number { 
    rule TOP {^\d+ } 
    } 

지금 모든 작품 : 문자열의

<137> worked! 
<137 > worked! 
<137> worked! 

나는 방법은 하나 또는 다른해야한다고 생각 할 이유가 없습니다. Grammars docs 두 가지 일이 말하지만, 워드 프로세서는 이러한 효과가 적용 주문하는 말을하지 않습니다 : 당신이 .parse 방법으로 분석하는 경우, 토큰 TOP 자동

를 고정되어

토큰 대신 규칙을 사용하면 원자 다음의 공백이 ws의 비 캡처 호출로 변환됩니다.


나는 대답은 규칙이 실제로 패턴의 의미에 고정되지 않는다는 생각합니다. 그것은 .parse의 작동 방식입니다. 커서는 위치 0에서 시작하고 문자열의 마지막 위치에서 끝나야합니다. 그것은 패턴 밖의 무언가입니다.

+0

cf https://irclog.perlgeek.de/perl6/2016-12-17#i_13756072 – raiph

답변

1

두 가지 정규식 효과가 없습니다. rule에는 :sigspace이 적용됩니다. 그 후에 문법이 정의됩니다. .parse에 전화하면 문자열의 시작 부분에서 시작하여 끝까지 이동합니다 (또는 실패합니다). 그 고정은 문법의 일부가 아닙니다. .parse이 문법을 적용하는 방법의 일부입니다.

내 주요 문제는 문서의 일부가 단어로 표시되는 이상한 방식이었습니다. 그들은 기술적으로 잘못된 것은 아니지만 독자가 모를 수도있는 것에 대한 지식을 가진 경향이 있습니다. 이 경우, 앵커에 관한 평상시의 언급 TOP은 그다지 특별하지 않습니다. .parse으로 전달 된 규칙은 동일한 방식으로 고정됩니다. .parse에 대한 호출에서 :rule의 기본값이 아닌 다른 규칙 이름에 대한 특별한 동작은 없습니다.

1

가 동작하도록 구성하고,이 언어 기능의 집대성되어

  • Sigspace 첫 원자 전에 공백을 무시한다. 설계 문서 1 가입일

    (S05: Regexes and Rules, line 348 강조 첨가)

    를 새로운 : S (: sigspace) 개질제 특정 공백 시퀀스가 ​​"중요한"것으로 간주되도록한다; 그들은 공백 일치 규칙으로 대체됩니다. 일치하는 구조체 (아톰, 양화 된 아톰 또는 어설 션) 바로 뒤에 오는 공백 순서 만 적합합니다. 초기 공백 문자는 가장 긴 토큰 매칭 대체에 참여할 수있는 규칙을 작성하기 쉽게하기 위해 정규식 앞에서 무시됩니다. 정규 표현식 구분 기호 안에 후행 공백이 중요합니다.

    이 의미

     
    rule TOP { \d+ } 
           ^-------- <.ws> automatically inserted 
    
    rule TOP {^\d+ $ } 
          ^---^-^---- <.ws> automatically inserted 
    
  • 정규 표현식에 어휘 범위 지정과 일류 컴파일 된 코드입니다.

    정규 표현식/규칙은 나중에 동작을 변경하기 위해 문자가 연결될 수있는 문자열이 아닙니다. 이것은 자급 자족 루틴이며, 파싱되어 컴파일 타임에 그 동작이 박살납니다.

    rule 키워드로 암시 적으로 추가 된 것을 포함하여 :sigspace과 같은 정규 표현식 수정자는 어휘 범위 (즉, 컴파일 타임에 나타나는 소스 코드 단편)에만 적용됩니다. S05, line 6291 :

    : I : m : R : S : DBA : Perl5에, 유니 레벨 수정은
  • 정규식 내부에 배치 될 수있다 (그리고 어휘 범위된다)
  • rule TOP의 고정은 런타임에 .parse에 의해 수행됩니다.

    S05, line 44231 :

    .parse와 처음으로 .parsefile 방법 앵커 텍스트의 끝, 텍스트의 끝에 도달하지 않은 경우 실패합니다. (TOP 규칙은 자체 오류 메시지를 생성하려면 $ 자체를 검사 할 수 있습니다.)

    문자열의 시작 부분에 고정하는 것은 TOP 규칙의 본질이 아니며 어휘 범위 TOP이 구문 분석되고 컴파일되는 방식에는 영향을 미치지 않습니다. 메소드 .parse이 호출 될 때 완료됩니다.

    .parse(..., rule => ...)을 사용하여 동일한 문법을 ​​TOP 대신에 다른 시작 규칙과 함께 사용할 수 있기 때문에이 방법이어야합니다.

그래서 당신은

rule TOP { \d+ } 

regex TOP { :r \d+ <.ws> } 

로 컴파일 쓸 때 그리고 그 문법은 효과적으로 앵커가되지 않는으로, 정규식 코드 ^ <TOP> $ 당신을 호출 할 때 .parseTOP의 어휘 범위의 일부가 아니라 단지 루틴 TOP.결합 동작은 규칙 TOP는 다음과 같이 기록했다 것처럼 :

regex TOP {^[:r :s \d+] $ } 

1) 설계 문서는 일반적으로 또는 펄의 일부가 아닌 무엇을 복음으로 간주 될 수 없습니다 6 언어이지만 S05는 아직 구현되지 않았지만 계획된 일부 기능을 언급한다는 점을 제외하고는 상당히 정확합니다. Perl 6 정규식/문법의 복잡함을 진정으로 극복하고자하는 사람은 적어도 한 번 이상 위에서 아래로 전체 S05를 읽으면 IMO를 잘 수행 할 수 있습니다.

+0

제 질문에서 지적했듯이 두 가지 다른 효과의 순서에 대해 약간 다른 점을 묻고있었습니다. 나는 문서가 "닻"의 사용에 오해의 소지가 있다고 생각한다. –

+0

@briandfoy : 답을 다시 썼습니다. – smls

+0

그래, 아직 물어 보지 않았던 것들. 도움을 주셔서 감사합니다,하지만 당신이 기본적으로 내 질문의 끝에 말한 것을 말하는 것 같아요. 그리고 S05의 문법 섹션은 매우 짧습니다. ;) –