অনেকগুলি আনুষ্ঠানিকতা রয়েছে, সুতরাং আপনি অন্যান্য উত্সগুলি দরকারী মনে করতে পারলে আমি এটিকে স্পষ্টভাবে নির্দিষ্ট করার জন্য আশা করি যে তারা প্রয়োজনীয় নয়।
একটি আরএম একটি সসীম স্টেট মেশিন এবং সুনির্দিষ্ট নামধারী রেজিস্ট্রি নিয়ে গঠিত, যার প্রত্যেকটিতে একটি অ-নেতিবাচক পূর্ণসংখ্যা থাকে। পাঠ্য ইনপুট আরামের জন্য এই টাস্কটির রাজ্যগুলির নামকরণও প্রয়োজন।
রাষ্ট্রের তিন প্রকার রয়েছে: বৃদ্ধি এবং হ্রাস, যা উভয়ই একটি নির্দিষ্ট রেজিস্টারকে উল্লেখ করে; এবং অবসান। একটি বর্ধিত অবস্থা তার নিবন্ধককে বাড়ায় এবং তার এক উত্তরসূরের নিয়ন্ত্রণ নিয়ন্ত্রণ করে। একটি হ্রাস রাষ্ট্রের দুটি উত্তরসূরি রয়েছে: এটির নিবন্ধ যদি শূন্য না হয় তবে এটি এটি হ্রাস করে এবং প্রথম উত্তরাধিকারীর নিয়ন্ত্রণ নিয়ন্ত্রণ করে; অন্যথায় (যেমন নিবন্ধটি শূন্য) এটি কেবল দ্বিতীয় উত্তরাধিকারীর নিয়ন্ত্রণ নিয়ন্ত্রণ করে।
প্রোগ্রামিং ল্যাঙ্গুয়েজ হিসাবে "কৌতূহল" জন্য, টার্মিনেটের রাজ্যগুলি মুদ্রণের জন্য কঠোর কোডেড স্ট্রিং নেয় (যাতে আপনি ব্যতিক্রমী সমাপ্তির ইঙ্গিত দিতে পারেন)।
ইনপুট স্টিডিনের। ইনপুট ফর্ম্যাটটিতে প্রতি রাজ্যে এক লাইন থাকে, তারপরে প্রাথমিক রেজিস্টার সামগ্রীগুলি থাকে। প্রথম লাইনটি প্রাথমিক অবস্থা। রাষ্ট্রীয় লাইনের জন্য বিএনএফ হ'ল:
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
সনাক্তকারী এবং বার্তার সংজ্ঞায় কিছু নমনীয়তা রয়েছে। আপনার প্রোগ্রামটি অবশ্যই শনাক্তকারী হিসাবে একটি খালি অ্যালফানিউমারিক স্ট্রিং গ্রহণ করতে পারে তবে আপনি যদি পছন্দ করেন তবে এটি আরও সাধারণ স্ট্রিং গ্রহণ করতে পারে (যেমন আপনার ভাষা যদি আন্ডারস্কোর সহ সনাক্তকারীকে সমর্থন করে এবং আপনার সাথে কাজ করা সহজ হয়)। একইভাবে, বার্তার জন্য আপনাকে অবশ্যই আলফানিউমারিকস এবং স্পেসগুলির একটি খালি খালি স্ট্রিং গ্রহণ করতে হবে , তবে আপনি আরও জটিল স্ট্রিং গ্রহণ করতে পারেন যা আপনি চাইলে পালানো নিউলাইন এবং ডাবল-উদ্ধৃতি অক্ষরকে মঞ্জুরি দেয়।
ইনপুটটির চূড়ান্ত লাইন, যা প্রাথমিক নিবন্ধকারকের মান দেয়, এটি শনাক্তকারী = int অ্যাসাইনমেন্টের একটি স্থান-বিভাজিত তালিকা, যা অবশ্যই খালি নয়। এটি প্রোগ্রামের নামকৃত সকল নিবন্ধককে সূচনা করার প্রয়োজন হয় না: যে কোনও সূচনা হয় না তা 0 বলে ধরে নেওয়া হয়।
আপনার প্রোগ্রামটির ইনপুটটি পড়তে হবে এবং আরএম অনুকরণ করতে হবে। যখন এটি একটি সমাপ্ত অবস্থায় পৌঁছায় তখন বার্তাটি, একটি নতুন লাইন এবং তারপরে সমস্ত নিবন্ধকের মানগুলি (যে কোনও সুবিধাজনক, মানব-পঠনযোগ্য, বিন্যাস এবং যে কোনও ক্রমে) প্রেরণ করা উচিত।
দ্রষ্টব্য: আনুষ্ঠানিকভাবে নিবন্ধকদের আনবাউন্ডেড পূর্ণসংখ্যা রাখা উচিত। তবে, আপনি যদি ধরে নিতে চান তবে কোনও নিবন্ধকের মান 2 ^ 30 এর বেশি হবে না।
কিছু সহজ উদাহরণ
a + = b, a = 0s0 : a - s1 "Ok"
s1 : b + s0
a=3 b=4
প্রত্যাশিত ফলাফল:
Ok
a=0 b=7
বি + = এ, টি = 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
আরও জটিল উদাহরণ
ডেইলিডব্লিউটিএফ এর জোসেফাস সমস্যা কোড চ্যালেঞ্জ থেকে নেওয়া। ইনপুট হ'ল এন (সৈন্য সংখ্যা) এবং কে (অগ্রিম) এবং আর ইন আউটপুট হ'ল বেঁচে থাকা ব্যক্তির (শূন্য সূচকযুক্ত) অবস্থান।
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
সেই চিত্রটি চিত্র হিসাবে, যারা দর্শনীয়ভাবে চিন্তা করেন এবং সিনট্যাক্সটি উপলব্ধি করতে সহায়ক বলে মনে করেন:
আপনি যদি এই গল্ফটি উপভোগ করেন তবে সিক্যুয়ালটি দেখুন ।