কোন প্রক্রিয়াতে সিনট্যাক্স ত্রুটি ঘটে? (টোকেনাইজিং বা পার্সিং)


23

আমি সংকলন এবং ব্যাখ্যা বোঝার চেষ্টা করছি, ধাপে ধাপে মোট চিত্র খুঁজে বের করছি। তাই আমি http://www.cs.man.ac.uk/~pjj/farrell/comp3.html এই নিবন্ধটি পড়ার সময় একটি প্রশ্নে উঠে এসেছি

এটা বলে :

সংকলকের পরবর্তী পর্যায়ে পার্সার বলা হয়। সংকলকটির এই অংশটির ভাষার ব্যাকরণ সম্পর্কে একটি ধারণা রয়েছে। এটি সিনট্যাক্স ত্রুটিগুলি চিহ্নিত করার জন্য এবং কোনও ত্রুটিমুক্ত প্রোগ্রামটি অভ্যন্তরীণ ডেটা স্ট্রাকচারে অনুবাদ করার জন্য যা অন্য ভাষায় ব্যাখ্যা করা বা লিখিত হতে পারে responsible

তবে আমি বুঝতে পারি না যে কীভাবে টোকেনাইজারটি প্রদত্ত স্ট্রিমটিতে সিনট্যাক্স ত্রুটিটি সঠিকভাবে টোকানাইজ করতে পারে।

এটি সেখানে আটকে থাকা বা পার্সারকে কিছু ভুল তথ্য দেওয়া উচিত। মানে টোকেনাইজিংও কি এক ধরণের অনুবাদক নয়?

সুতরাং কীভাবে এটি টোকেনাইজ করার সময় কোডটির লেজিকাল দূষিত লাইনগুলি কাটিয়ে উঠবে।

টোকেনাইজার শিরোনামে উপরের লিঙ্কটির ভিতরে টোকেনের একটি উদাহরণ রয়েছে ।

আমি টোকেনের ফর্মটি বুঝতে পারছি বলে মনে হচ্ছে, কোড টোকেনে কিছু ভুল থাকলে তাও দূষিত হবে।

আপনি কি আমার ভুল বোঝাবুঝি পরিষ্কার করতে পারেন?

উত্তর:


32

একটি টোকনাইজার কেবলমাত্র পার্সার অপ্টিমাইজেশন। টোকনাইজার ছাড়াই পার্সার কার্যকর করা পুরোপুরি সম্ভব।

একটি টোকেনাইজার (বা লেজারার, বা স্ক্যানার) ইনপুটটিকে টোকেনগুলির তালিকায় ফেলেছে। স্ট্রিংয়ের কিছু অংশ (মন্তব্য, সাদা স্থান) সাধারণত উপেক্ষা করা হয়। প্রতিটি টোকেনের একটি টাইপ থাকে (ভাষায় এই স্ট্রিংটির অর্থ) এবং একটি মান (স্ট্রিং যা টোকেন তৈরি করে)। উদাহরণস্বরূপ, পিএইচপি উত্স স্নিপেট

$a + $b

টোকেন দ্বারা প্রতিনিধিত্ব করা যেতে পারে

Variable('$a'),
Plus('+'),
Variable('$b')

এই প্রসঙ্গে টোকেন সম্ভব কিনা তা টোকেনাইজার বিবেচনা করে না। উদাহরণস্বরূপ, ইনপুট

$a $b + +

আনন্দের সাথে টোকেন স্ট্রিম উত্পাদন করবে

Variable('$a'),
Variable('$b'),
Plus('+'),
Plus('+')

যখন পার্সার এই টোকেনগুলি গ্রাস করবে, তখন লক্ষ্য করা যাবে যে দুটি ভেরিয়েবল একে অপরকে অনুসরণ করতে পারে না এবং দুটি ইনফিক্স অপারেটরও পারে না। (নোট করুন যে অন্যান্য ভাষাগুলিতে বিভিন্ন বাক্য গঠন রয়েছে যেখানে এই জাতীয় টোকেন স্ট্রিম আইনী হতে পারে তবে পিএইচপিতে নয়)।

একটি পার্সার এখনও টোকনাইজার পর্যায়ে ব্যর্থ হতে পারে। উদাহরণস্বরূপ, একটি অবৈধ চরিত্র থাকতে পারে:

$a × ½ — 3

কোনও পিএইচপি টোকেনাইজার এই নিয়মগুলির সাথে এই ইনপুটটির সাথে মেলে ধরতে অক্ষম হবে এবং মূল পার্সিং শুরু হওয়ার আগে একটি ত্রুটি তৈরি করবে।

আরও আনুষ্ঠানিকভাবে, টোকেনাইজারগুলি ব্যবহৃত হয় যখন প্রতিটি টোকেনকে নিয়মিত ভাষা হিসাবে বর্ণনা করা যায় । টোকেনগুলি তখন অত্যন্ত দক্ষতার সাথে মেলা যায়, সম্ভবত একটি ডিএফএ হিসাবে প্রয়োগ করা হয়। বিপরীতে, মূল ব্যাকরণটি সাধারণত প্রাসঙ্গিক মুক্ত এবং আরও জটিল, কম পারফরম্যান্ট পার্সিং অ্যালগরিদম যেমন এলএলআর এর প্রয়োজন হয়।


সুতরাং আমরা টোকনাইজারটিকে পার্সারের অংশ হিসাবে ভাবতে পারি এবং সিনট্যাক্স ত্রুটিটি টোকেনাইজিং স্টেপ বা সিনট্যাক্স ত্রুটির ফর্ম অনুসারে পদক্ষেপ পার্সিংয়ের মাধ্যমে ঘটে যেতে পারে। স্পষ্টির জন্য ধন্যবাদ।
এফজেডে

4
@ ফিজ: আপনি সেভাবে ভাবতে পারেন তবে এটি বিভ্রান্তিকর। লেক্সিং "কেবল একটি পার্সার অপ্টিমাইজেশন" নয়। পরিবর্তে, লেক্সিং একটি শারীরিক উপস্থাপনা (চরিত্রের কিছু ক্রম) একটি যৌক্তিক উপস্থাপনা (সেই অক্ষর দ্বারা চিহ্নিত টোকেন) হিসাবে মানচিত্র করে। এটি লাইনটির প্রান্তটি কীভাবে উপস্থাপিত হয় বা আপনি লজিক্যাল-এবং হিসাবে andবা &&অন্য কিছু উপস্থাপন করার সিদ্ধান্ত নেন কিনা তা এইভাবে মিনিসার থেকে পার্সারকে পৃথক করে । এটি (বেশিরভাগ ক্ষেত্রে) পৃথক এবং পার্সিং থেকে পৃথক। অপ্টিমাইজেশন (যদি থাকে তবে) প্রায় দুর্ঘটনাযুক্ত পার্শ্ব প্রতিক্রিয়া।
জেরি কফিন 21

@ জেরি কফিন আরও ব্যাখ্যা করার জন্য ধন্যবাদ এটি এখন আরও অর্থবোধ করে।
এফজেডে

2
@ জেরি কফিন, আমন ঠিক যে পার্থক্যটি মৌলিক নয়। আপনি একটি সমন্বিত বিএনএফ ব্যাকরণ তৈরি করতে পারেন যা "লেক্সার" এবং "পার্সার" উভয় অংশকেই কভার করে। আমরা সাধারণত নিয়মগুলিকে নিম্ন স্তরের (উদাহরণস্বরূপ, সংখ্যা, সংযোজন অপারেটর) এবং উচ্চ স্তরের (সংক্ষেপণ) শ্রেণীবদ্ধ করি তবে ব্যাকরণ নিজেই এ জাতীয় কোনও পার্থক্য করে না।
পল ড্রাগন

1
@ পলড্রাপার নিশ্চিত নয় যে প্রথম পর্যায়ে কোনও নিয়মিত ভাষা আলাদা করা সঠিক পছন্দ। উদাহরণস্বরূপ ম্যাচিং জোড় (নিয়মিত নয়) কিছু ভাষায় স্ট্রিং লিটারেলগুলি বর্ণনা করার প্রয়োজন হতে পারে, তবুও প্রথম পর্যায়ে এগুলি হ্যান্ডেল করা এখনও বোধগম্য। ব্যাক-ট্র্যাকিং এড়ানো / হ্রাস করা আরও ভাল গাইডলাইন বলে মনে হচ্ছে।
কোডসইনচাউস

16

আপনি সাধারণত পার্সার থেকে বেশিরভাগ সিনট্যাক্স ত্রুটিগুলি আশা করবেন, লেসারের নয়।

ইনপুটটিতে এমন কিছু উপস্থিত রয়েছে যা টোকেনাইজ করা যায় না তবে লেক্সার একটি ত্রুটি তৈরি করে। অনেকগুলি ভাষায়, তবে প্রায় কোনও চরিত্রের ক্রম কোনও ধরণের টোকেনে রূপান্তরিত হতে পারে, তাই এখানে ত্রুটিগুলি মোটামুটি অস্বাভাবিক।

পার্সারটিতে একটি ত্রুটি তৈরি হবে যদি ইনপুটটিতে বৈধ টোকেন থাকে তবে সেই টোকেনগুলি সাজানো না হয় তাই তারা লক্ষ্য ভাষায় বৈধ বিবৃতি / অভিব্যক্তি গঠন করে। এটি একটি নিয়ম হিসাবে অনেক বেশি সাধারণ।


11

টোকেনাইজার কেবলমাত্র অক্ষর প্রবাহকে টোকনে বিভক্ত করে। টোকেনাইজার পিওভি থেকে এটি সম্পূর্ণ বৈধ:

1 * * 1

এবং এর মতো কিছুতে অনুবাদ করে: ["1", MULTIPLY, MULTIPLY, "1"] কেবলমাত্র পার্সার এই জাতীয় অভিব্যক্তি প্রত্যাখ্যান করতে পারে - এটি জানে যে মাল্টিপল অপারেটর অন্য কোনও গুণিত অপারেটরকে অনুসরণ করতে পারে না। জাভাস্ক্রিপ্ট উদাহরণস্বরূপ:

Uncaught SyntaxError: Unexpected token *(…)

টোটিনাইজার দ্বারা সনাক্ত করা হতে পারে যা ত্রুটি রয়েছে। উদাহরণ হিসেবে বলা যায় অসমাপ্ত স্ট্রিং লিটারেল: "abcঅথবা অবৈধ সংখ্যা: 0x0abcdefg। তারা এখনও বাক্য গঠন ত্রুটি হিসাবে রিপোর্ট করা হতে পারে যদিও:

Uncaught SyntaxError: Unexpected token ILLEGAL

দ্রষ্টব্য তবে টোকেনটি স্বীকৃত ছিল না এবং হিসাবে রিপোর্ট করা হয়েছে ILLEGAL

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.