{"id":16634875,"url":"https://github.com/amir78729/dfa-simulation","last_synced_at":"2026-04-28T04:03:14.842Z","repository":{"id":115877593,"uuid":"270936245","full_name":"amir78729/DFA-simulation","owner":"amir78729","description":"Creating Deterministic Finite Automatas and using it to check if an input string is valid or not","archived":false,"fork":false,"pushed_at":"2020-07-21T08:03:36.000Z","size":984,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-03-11T23:44:04.327Z","etag":null,"topics":["dfa-simulator","theory-of-machines-and-languages"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/amir78729.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2020-06-09T07:43:45.000Z","updated_at":"2023-05-21T21:41:34.000Z","dependencies_parsed_at":null,"dependency_job_id":"74d4967a-721f-47c8-bb3e-cd037e6d968d","html_url":"https://github.com/amir78729/DFA-simulation","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/amir78729/DFA-simulation","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/amir78729%2FDFA-simulation","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/amir78729%2FDFA-simulation/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/amir78729%2FDFA-simulation/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/amir78729%2FDFA-simulation/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/amir78729","download_url":"https://codeload.github.com/amir78729/DFA-simulation/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/amir78729%2FDFA-simulation/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32365519,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-27T20:07:02.737Z","status":"online","status_checked_at":"2026-04-28T02:00:07.250Z","response_time":56,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["dfa-simulator","theory-of-machines-and-languages"],"created_at":"2024-10-12T05:48:47.063Z","updated_at":"2026-04-28T04:03:14.819Z","avatar_url":"https://github.com/amir78729.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Theory of Machines and Languages First Project (Q1)\n\nابتدا چهار کلاس زیر را تعریف میکنیم:\n\n\u003e State\n\nدر این کلاس هر حالت را تعریف میکنیم. این کلاس فیلد هایی نظیر عنوان و دو فیلد از نوع بولین دارد که مشخص میکنند که آیا این  حالت یک حالت نهایی/ابتدایی هست یا خیر.\n\n\u003e Path\n\nدر این کلاس تلاش بر این داریم که یک مسیر را نمایش بدهیم. یک مسیر یعنی اینکه ما با گرفتن یک ورودی -که میان الفباهای تعریف شده است- از حالت فعلی به حالت بعدی برویم. در اینجا در فیلد اول و سوم به جای اینکه خود حالات را بعنوان فیلد انتخاب کنیم، عنوانشان را برگزیدیم (با این فرض که هیچ دو حالتی وجود ندارند که نامشان یکسان باشد!)\n\n\u003e Acceptor\n\nیک پذیرنده در اصل همان ماشینی است که قصد طراحی آن را داریم. در واقع تمام کلاس های قبل را تعریف کردیم که بتوانیم این کلاس را طراحی کنیم. تمامی حالات، مسیر ها و الفباهای مجاز در این ماشین را داخل این کلاس قرار میدهیم.هنگام ساخته شدن این ماشین دو حالت وجود خواهد داشت(که از کاربر پرسیده میشود):\n\n- ساخته شدن این ماشین را به عهده خود برنامه قرار دهیم. یعنی کاربر هیچ نقشی در ساخته شدن آن نخواهد داشت. این اطلاعات پیش‌فرض، همان مقادیری هستند که در صورت سوال به ما داده شده است.\n\n-\tگرفتن اطلاعات از کاربر؛ یعنی کاربر در سطر اول الفباها، سطری بعد تمام حالات موجود در ماشین، سطر بعد حالت شروع سطر بعد حالت های نهایی و در خطوط بعدی را به اطلاعات هریک از مسیر های ماشین اختصاص دهد؛ بدین صورت که در هر سطر به ترتیب عنوان حالت شروع، الفبایی که موجب تغییر حالت میشود و در آخر عنوان حالت پایان را وارد میکند و میان هرکدام از این موارد از space استفاده کند. ورودی گرفتن تا زمانی صورت میگیرد که تعداد قسمت هایی که در هر سطر وارد شده و به وسیله ی space از هم جدا شده اند دقیقاً ۳ باشد. نه کمتر، نه بیشتر...\n\n-\tساخته شدن ماشین از داخل یک فایل متنی؛ برنامه دو گزینه پیش روی ما قرار خواهد داد: ۱) خواندن یک فایل داخل پوشه‌ی تمرین مورد نظر به نام خواسته شده و ۲) خواندن فایل با یک نام که کاربر مشخص میکند.  حال اگر ورودی های داخل فایل مورد نظر صحیح بود ماشین به درستی کار میکند در غیر این صورت برنامه به ما خطا میدهد.\n\n\u003e Main\n\nاین کلاس در اصل برای ارتباط برنامه با کاربر طراحی شده است. در ابتدای برنامه عبارت زیر ظاهر میشود:\n\n```\nCHOOSE ONE OF THIS OPTIONS:\n A - USE A DEFAULT DFA\n B - CREATE YOUR OWN DFA\n Q - EXIT THE PROGRAM\n```\nکه واضح است هر کدام از قسمت ها مربوط به چه کاری هستند. اگر ما یکی از حالات داده شده را انتخاب کنیم بسته به مطالبی که در قسمت کلاس پذیرنده توضیح داده شد، ماشین مورد نظرمان را میسازیم. بعد از ساخته شدن این ماشین پیام زیر ظاهر میگردد: \n```\nNOW YOU CAN ENTER STRINGS WITH THIS ALPHABETS:\n[a, b]\nENTER \" /quit \" TO GO BACK.\nENTER \" /status \" TO GET THE DFA'S STATUS.\n```\nکه وضعیت این پذیرنده بصورت زیر نشان داده میشود:\n```\n\u003e\u003e\u003e ALPHABETS:\n   \u003e\u003e\u003e a\n   \u003e\u003e\u003e b\n---------------------------------------\n\u003e\u003e\u003e ALL OF THE STATES:\n   \u003e\u003e\u003e Q0\n   \u003e\u003e\u003e Q1\n   \u003e\u003e\u003e Q2\n---------------------------------------\n\u003e\u003e\u003e START STATES: \n   \u003e\u003e\u003e Q0\n---------------------------------------\n\u003e\u003e\u003e FINAL STATES:\n   \u003e\u003e\u003e Q1\n---------------------------------------\n\u003e\u003e\u003e PATHS:\n   \u003e\u003e\u003e ( Q0 ) ----- a -----\u003e ( Q1 )\n   \u003e\u003e\u003e ( Q0 ) ----- b -----\u003e ( Q1 )\n   \u003e\u003e\u003e ( Q1 ) ----- a -----\u003e ( Q2 )\n   \u003e\u003e\u003e ( Q1 ) ----- b -----\u003e ( Q2 )\n   \u003e\u003e\u003e ( Q2 ) ----- a -----\u003e ( Q2 )\n   \u003e\u003e\u003e ( Q2 ) ----- b -----\u003e ( Q2 )\n```\nاگر هر چیز دیگری به غیر از دو دستور گفته شده وارد شود، برنامه آن را یک رشته ی ورودی در نظر میگیرد و آن را تحلیل میکند. کاراکترها را از چپ به راست بررسی میکند و مشخض میکند که این ورودی مقبولِ این ماشین میباشد یا خیر. بدیهی است که اگر یکی از ورودی ها نامعتبر باشد ماشین دست از کار میکشد و اعلام میکند که این ورودی نامعتبر بوده و منتظر ورودی های بعدی نمیماند. بعنوان مثال اگر ما ورودی زیر را به این پذیرنده بدهیم، ورودی های زیر را دریافت خواهیم کرد:\n```\nINPUT STRING: \" abadi \"\n( 1 = SUCCESSFUL STEP , 0 = FAILED)\n( Q0 ) ----- a -----\u003e ( Q1 )\n\n| a | b | a | d | i |\n| 1 | - | - | - | - |\n\n( Q1 ) ----- b -----\u003e ( Q2 )\n\n| a | b | a | d | i |\n| 1 | 1 | - | - | - |\n\n( Q2 ) ----- a -----\u003e ( Q2 )\n\n| a | b | a | d | i |\n| 1 | 1 | 1 | - | - |\n\nERROR FOUND WHILE READING INPUT \"d\"!\n\n| a | b | a | d | i |\n| 1 | 1 | 1 | 0 | - |\n\nTHIS STRING IS NOT VALID!!!!\n```\nمشاهده میشود که در هر مرحله علاوه بر نمایش مسیر مورد نظر، زیر ورودی های کاربر عبارات زیر نمایش داده شده اند:\n\n-\t:1 یعنی این ورودی خاص توسط پذیرنده به درستی پذیرفته شده و مشکلی پیش نیامده است.\n\n-\t:0 یعنی با خطا روبرو شده ایم! خطا هم میتواند ملاحظه‌ی حرفی خارج از الفبای این ماشین و هم میتواند زمانی باشد که با الفبای مورد نظر مسیری به یک حالت دیگر وجود نداشته باشد.\n\n-\t-: یعنی هنوز زمان بررسی این الفبا فرا نرسیده است.\n\nمنطقی است زمانی که در مرحله ی آخر عبارت زیر رشته‌ی ورودی کاربر بصورت 111..1 باشد. یعنی مشکلی رخ نداده است. حال باید به حالتی که دستگاه در حال حاضر در آن قرار دارد نگاه کنیم. اگر این حالت جزو حالات نهایی این دستگاه بود یعنی این رشته پذیرفته شده، وگرنه رشته‌ی ورودی معتبر نخواهد بود!\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Famir78729%2Fdfa-simulation","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Famir78729%2Fdfa-simulation","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Famir78729%2Fdfa-simulation/lists"}