>source

perl6은 어떤 proto 를 결정합니까?   token  먼저 상대와?

아래 코드는 예상대로 작동하며 문자열 1234 와 일치합니다. 및 Grammar::Tracer  일치하는 첫 번째 토큰이 s:sym<d> 임을 나타냅니다. 가장 긴 토큰이므로 의미가 있습니다.

그러나 리터럴을 토큰으로 변경 한 경우 (예 : token 변경)   three  양식 '3'   <digit> 로 일치하지 않으며 Grammar::Tracer  그 s:sym<b> 를 보여줍니다  먼저 일치해야합니다.

s:sym<d> 이동  맨 위로, 두 경우 모두 문자열과 일치하지만 해당 동작에 대한 설명은 무엇입니까?

#!/usr/bin/env perl6
no precompilation;
use Grammar::Tracer;
grammar G {
  token TOP { <s> }
  proto token s { * }
  token s:sym<a> { <one> }
  token s:sym<b> { <one> <two> }
  token s:sym<c> { <one> <two> <three> }
  token s:sym<d> { <one> <two> <three> <four> }
  token one   { '1' }
  token two   { '2' }
  token three { '3' }
  token four  { '4' }
}
my $g = G.new;
say $g.parse: '1234';

# Output: Match
# token three { '3' }
TOP
|  s
|  |  s:sym<d>
|  |  |  one

# Output No Match
# token three { <digit> }
TOP
|  s
|  |  s:sym<b>
|  |  |  one

  • 답변 # 1

    와이즈 비즈

    "가장 긴 대체"논리를 사용합니다. 귀하의 (잘 제시된 경우) 관련 결정 요인은 다음과 같습니다.

    와이즈 비즈

    첫 번째로 집중해야 할 것은 "가장 긴 토큰"이 아니라 가장 긴선언 접두사, 연속적인 "선언"을 포함하는 패턴의시작이라는 것입니다. "원자".

    와이즈 비즈  선언적 원자입니다.

    와이즈 비즈  있을 수도 있고 아닐 수도 있습니다. 포함 여부에 따라 다릅니다.

    내장내장패턴이 선언적이고 명확하지 않은 공식 문서를 찾지 못했지만 슬래시로 선언 된 모든 패턴처럼 보입니다 (예 :

    How does perl6 decide which proto token to match against first?

    ).

    First, select the branch which has thelongest declarative prefix.

    형식으로 선언 된 반면, 선언적임 예 : 3 아닙니다. (특히 내장 <foo>  패턴은 선언적아님입니다. \d 에서 원자 뒤의 공간을 감안할 때   <foo> 로 변환됩니다 , 이는 첫 번째 공간이 해당 규칙의 선언 접두사를 종료 함을 의미합니다.

    그래서 <digit>  atom은 선언적 접두사의 일부가 아니며 대신 접두사를 종료합니다.

    와이즈 비즈 와이즈 비즈  맨 위로, 두 경우 모두 문자열과 일치하지만 해당 동작에 대한 설명은 무엇입니까?

    <ws> 의 변화로 인해   rules 에 전화  가장 긴 선언적 접두사 ( <ws> )를 위해 세 개의 묶기로 규칙을 변경했습니다. ). 따라서 다른 동점 규칙이 사용됩니다.

    타이 어기 규칙에서 다른 모든 사람이 승자를 선택하지 못하면 상속을 무시하고 마지막으로 가장 왼쪽에있는 규칙이 선택됩니다. <digit>

  • 이전 c# - 사전 Net에 해시 된 이메일 저장
  • 다음 javascript - Threejs 쿼터니언 slerp은 극 근처에서 나쁜 결과를 제공합니다