J: 파싱과 실행
J: 파싱과 실행
J 언어의 문장이 어떻게 파싱되고 실행되는지 설명해요. 좌에서 우 진행 규칙, 우선순위, 그리고 공식 파싱 표(parse table)를 다뤄요.
출처: 문서
본문
문장은 언어의 파싱 규칙이 결정하는 순서로 그 구(phrase)들을 실행함으로써 평가돼요. 예를 들어, 문장 10%3+2에서 구 3+2가 먼저 평가되어 그 결과가 10을 나누는 데 쓰여요. 요약하자면:
| | 1. | 실행은 오른쪽에서 왼쪽으로 진행돼요. 단, 오른쪽 괄호가 나타나면, 그 괄호와 짝을 이루는 왼쪽 괄호로 감싸인 구간(segment)이 실행되고, 그 결과가 전체 구간과 그를 감싸는 괄호를 대체해요. |
| | 2. | 부사와 접속사는 동사보다 먼저 실행돼요. 구 ,"2-a는 (,"2)-a와 동등하며, ,"(2-a)가 아니에요. 게다가 부사나 접속사의 왼쪽 인자는 그것보다 앞에 오는 전체 동사 구(phrase)예요. 따라서 구 +/ . */b에서 맨 오른쪽 부사 /는 구 +/ . *에서 파생된 동사에 적용되지, 동사 *에 적용되지 않아요. |
| | 3. | 동사는 가능하면 이항(dyadically)으로 적용돼요. 즉, 앞에 접속사의 오른쪽 인자가 아닌 명사가 선행하면 이항으로 적용돼요. |
| | 4. | 특정 트레인(train)은 §F에서 설명한 대로 동사와 부사를 형성해요. |
| | 5. | 이 요약 파싱 규칙들이 아래에 규정된 정확한 파싱 규칙과 일치하도록, 명사나 동사 외의 무엇이든 만들어 내는 부사적·접속사적 구는 괄호로 묶는 것이 필요할 수 있어요. |
이 규칙들의 한 가지 중요한 결과는, 괄호로 묶지 않은 표현에서 어떤 동사의 오른쪽 인자도 그 오른쪽에 있는 전체 구의 결과라는 점이에요. 따라서 문장 3*p%q^|r-5는 왼쪽에서 오른쪽으로 읽을 수 있어요: 전체 결과는 3 곱하기 나머지 구의 결과이며, 그것은 p와 % 뒤에 오는 부분의 몫이고, 이렇게 계속돼요.
파싱은 대기열(queue, 처음에는 마커 §가 앞에 붙은 원래 문장)의 꼬리 끝에서 스택(stack, 처음에는 네 개의 마커)의 맨 위로 연속적인 요소(또는 그 값 — connect사 바로 왼쪽의 속담(proverbs)과 이름의 경우는 제외)를 옮기고, 결국 스택에서 자격이 있는 어떤 부분을 실행하고 그것을 실행 결과로 대체함으로써 진행돼요. 예를 들어, a=: 1 2 3이면 b=:+/2*a는 다음과 같이 파싱되고 실행돼요. (스택 맨 아래의 네 개의 마커는 표시되지 않아요.)
§ b =: + / 2 * a
§ b =: + / 2 * 1 2 3 Move
§ b =: + / 2 * 1 2 3 Move
§ b =: + / 2 * 1 2 3 Move
§ b =: + / 2 * 1 2 3 Move
§ b =: + / 2 4 6 2 Dyad
§ b =: + / 2 4 6 Move
§ b =: + / 2 4 6 Move
§ b =: +/ 2 4 6 3 Adverb
§ b =: 12 0 Monad
§ b =: 12 Move
§ 12 7 Is
§ 12
앞의 내용은 두 가지 점을 보여줘요:
- 구
2 * 1 2 3의 실행은 다음 요소(그/)가 전달될 때까지 연기돼요. 만약 그다음이 접속사였다면2는 그 인자가 되고, 단항*가1 2 3에 적용됐을 거예요. 그리고 - 이름
a의 값은 스택으로 이동하지만, 이름b는(연결사 앞에 오므로) 변하지 않은 채로 이동하며, 대명사b에는 값 12가 할당돼요.
파싱은 system\packages\misc\trace.ijs의 추적(trace) 기능을 사용해 관찰할 수 있어요.
스택에서의 실행은 처음 네 개의 요소에만 국한되며, 실행 자격은 각 요소의 클래스(명사, 동사 등 — 배정되지 않은 이름은 동사로 취급)에 의해서만 결정돼요. 다음 파싱 표에 규정된 대로예요. 스택의 처음 네 요소의 클래스를 표의 처음 네 열과 비교하여, 네 열 모두에서 일치하는 첫 행이 선택돼요. 그 행의 굵은 이탤릭 요소들은 마지막 열에 표시된 동작을 받아 그 결과로 대체돼요. 만족되는 행이 없으면 다음 요소가 대기열에서 전달돼요.
| | EDGE | VERB | NOUN | ANY | 0 Monad | | | EDGE+AVN | VERB | VERB | NOUN | 1 Monad | | | EDGE+AVN | NOUN | VERB | NOUN | 2 Dyad | | | EDGE+AVN | VERB+NOUN | ADV | ANY | 3 Adverb | | | EDGE+AVN | VERB+NOUN | CONJ | VERB+NOUN | 4 Conj | | | EDGE+AVN | VERB+NOUN | VERB | VERB | 5 Fork | | | EDGE | CAVN | CAVN | ANY | 6 Bident | | | NAME+NOUN | ASGN | CAVN | ANY | 7 Is | | | LPAR | CAVN | RPAR | ANY | 8 Paren |
범례(Legend): | | AVN | denotes | ADV+VERB+NOUN | | | CAVN | denotes | CONJ+ADV+VERB+NOUN | | | EDGE | denotes | MARK+ASGN+LPAR |