많은 형식주의가 있기 때문에 다른 출처가 유용하다는 것을 알 수 있지만 필요하지 않을 정도로 명확하게 지정하고 싶습니다.
RM은 유한 상태 머신과 유한 한 수의 명명 된 레지스터로 구성되며, 각각 음수가 아닌 정수를 보유합니다. 텍스트를 쉽게 입력 할 수 있도록이 작업에서는 상태 이름도 지정해야합니다.
상태에는 세 가지 유형이 있습니다. 증가와 감소는 둘 다 특정 레지스터를 참조합니다. 종료합니다. 증가 상태는 레지스터를 증가시키고 제어를 해당 후속 작업으로 전달합니다. 감소 상태에는 두 개의 후속 작업이 있습니다. 레지스터가 0이 아닌 경우 감소하고 첫 번째 후속 작업에 제어를 전달합니다. 그렇지 않으면 (즉, 레지스터가 0 임) 단순히 두 번째 후속 작업에 제어를 전달합니다.
프로그래밍 언어 인 "niceness"의 경우 종료 상태는 인쇄하기 위해 하드 코드 된 문자열을 사용하므로 예외적으로 종료 될 수 있습니다.
입력은 표준 입력입니다. 입력 형식은 상태 당 한 줄로 구성되며 초기 레지스터 내용이 이어집니다. 첫 번째 줄은 초기 상태입니다. 상태 라인의 BNF는 다음과 같습니다.
line ::= inc_line
| dec_line
inc_line ::= label ' : ' reg_name ' + ' state_name
dec_line ::= label ' : ' reg_name ' - ' state_name ' ' state_name
state_name ::= label
| '"' message '"'
label ::= identifier
reg_name ::= identifier
식별자와 메시지의 정의에는 약간의 융통성이 있습니다. 프로그램 은 비어 있지 않은 영숫자 문자열을 식별자로 받아 들여야 하지만 원하는 경우보다 일반적인 문자열을 받아 들일 수 있습니다 (예 : 언어에서 밑줄이있는 식별자를 지원하고 작업하기가 더 쉬운 경우). 마찬가지로, 메시지를 당신이 해야한다 영숫자와 공간의 비어 있지 않은 문자열을 받아,하지만 당신은 할 수 있습니다 당신이 원하는 경우에 탈출 줄 바꿈 및 따옴표 문자를 수있는 더 복잡한 문자열을 받아들입니다.
초기 레지스터 값을 제공하는 마지막 입력 행은 공백으로 구분 된 identifier = int 할당 목록이며 비어 있지 않아야합니다. 프로그램에 명명 된 모든 레지스터를 초기화 할 필요는 없습니다. 초기화되지 않은 것은 0으로 간주됩니다.
프로그램은 입력을 읽고 RM을 시뮬레이션해야합니다. 종료 상태에 도달하면 메시지, 줄 바꿈 및 모든 레지스터의 값 (편리하고 사람이 읽을 수있는 형식 및 순서대로)을 표시해야합니다.
참고 : 공식적으로 레지스터에는 제한없는 정수가 있어야합니다. 그러나 레지스터 값이 2 ^ 30을 초과하지 않는다고 가정 할 수 있습니다.
몇 가지 간단한 예
a + = b, a = 0s0 : a - s1 "Ok"
s1 : b + s0
a=3 b=4
예상 결과 :
Ok
a=0 b=7
b + = a, t = 0
init : t - init d0
d0 : a - d1 a0
d1 : b + d2
d2 : t + d0
a0 : t - a1 "Ok"
a1 : a + a0
a=3 b=4
예상 결과 :
Ok
a=3 b=7 t=0
까다로운 파싱 머신의 테스트 사례
s0 : t - s0 s1
s1 : t + "t is 1"
t=17
예상 결과 :
t is 1
t=1
과
s0 : t - "t is nonzero" "t is zero"
t=1
예상 결과 :
t is nonzero
t=0
더 복잡한 예
DailyWTF의 Josephus 문제 코드 문제에서 발췌. 입력은 n (병사 수) 및 k (사전)이며 r의 출력은 생존 한 사람의 위치 (0으로 색인)입니다.
init0 : k - init1 init3
init1 : r + init2
init2 : t + init0
init3 : t - init4 init5
init4 : k + init3
init5 : r - init6 "ERROR k is 0"
init6 : i + init7
init7 : n - loop0 "ERROR n is 0"
loop0 : n - loop1 "Ok"
loop1 : i + loop2
loop2 : k - loop3 loop5
loop3 : r + loop4
loop4 : t + loop2
loop5 : t - loop6 loop7
loop6 : k + loop5
loop7 : i - loop8 loopa
loop8 : r - loop9 loopc
loop9 : t + loop7
loopa : t - loopb loop7
loopb : i + loopa
loopc : t - loopd loopf
loopd : i + loope
loope : r + loopc
loopf : i + loop0
n=40 k=3
예상 결과 :
Ok
i=40 k=3 n=0 r=27 t=0
시각적으로 생각하고 구문을 이해하는 것이 도움이되는 사람들을위한 그림으로서의 그 프로그램 :
이 골프를 즐겼다면 속편을보십시오 .