একই অগ্রাধিকারের দুটি বাইনারি অপারেটর, বাম-সাহচর্যকারী এবং ডান-সহযোগী সহ ভাষা


11

কোন প্রোগ্রামিং (অথবা স্ক্রিপ্টিং) ভাষা (অথবা কিছু ডোমেন নির্দিষ্ট ভাষা) দুই বাইনারি অপারেটর ভুগেন oplএবং oprএর একই প্রাধান্য দিয়ে oplকরা হচ্ছে বাম-মিশুক এবং oprডান-মিশুক হচ্ছে?

(আমি এরকম উদাহরণ খুঁজে পাই না, তবে আমি সেই অদ্ভুত ক্ষেত্রে পরিচালনা করার জন্য কিছু পার্সার জেনারেলকে কোড করার চেষ্টা করছি)

X opl y opr z বা x opr y opl z ফর্মের এক্সপ্রেশনগুলি কীভাবে পার্স করা হবে? এবং আরও সাধারণভাবে আরও বেশি অপারেটর দিয়ে?


4
যদি ব্যথা হয়, তা করবেন না।
কোডসইনচাউস

1
হাসকেলে, আপনি নিজের ইনফিক্স অপারেটরদের তাদের নিজস্ব নজিরগুলি সংজ্ঞায়িত করতে পারেন এবং আপনি এই ক্ষেত্রে একটি ত্রুটি পান; যদি আপনি x <@ y @> zসঙ্গে <@হচ্ছে বাম-মিশুক এবং @>হচ্ছে ডান-মিশুক, GHC আপনি একটি "প্রাধান্য পার্স ত্রুটি" দেয়: "মিশ্রিত করা যাবে না ' <@' [infixl 0] এবং ' @>' [infixr 0] একই পোতা এক্সপ্রেশনে" (আমি কোথায় সংজ্ঞায়িত উদাহরণস্বরূপ 0 স্তরে এই অপারেটরগুলি)।
এন্টাল স্পেক্টর-জাবুস্কি

@ আন্টালস্পেক্টর-জাবুসকি: এটি দুর্দান্ত উত্তর হবে!
বেসাইল স্টারিঙ্কেভিচ

@ আন্টালস্পেক্টর-জাবুসকি: সুইফটেও একই রকম। আমি মনে করি আপনি প্রকৃতপক্ষে অপারেটরগুলি সংজ্ঞায়িত করতে পারেন, তবে একটি অভিব্যক্তিতে আপনাকে অবশ্যই সমস্ত বাম সংঘবদ্ধ বা ডান সহযোগী অপারেটরগুলি একই নজির সহ ব্যবহার করতে হবে। সুতরাং আপনি x বামে y বাম টিপ জেড, বা এক্স রাইটোপ ই রাইটোপ জেড ব্যবহার করতে পারেন তবে এক্স বামপন্থী y রাইটোপ জেড ব্যবহার করতে পারেন।
gnasher729

@ বাসাইলস্টারিঙ্কেভিচ: আপনার ইচ্ছামতো! যেহেতু আপনি "নমনীয় পার্সার্স" উল্লেখ করেছেন, তাই আমি বেশ কয়েকটি আরও অস্পষ্ট ভাষা অন্তর্ভুক্ত করেছি যার মধ্যে খুব নমনীয় পার্সার রয়েছে (কখনও চাইছিল if_then_else_বা [1;2;3]গ্রন্থাগারে সংজ্ঞায়িত করা যায়?)
এন্টাল স্পেক্টর-জাবুসকি

উত্তর:


10

এখানে তিনটি ভাষা রয়েছে যা আপনাকে আপনার নিজস্ব অপারেটরগুলি সংজ্ঞায়িত করতে দেয়, যা আড়াই থেকে আলাদা বিভিন্ন কাজ করে! হাস্কেল এবং কোক উভয়ই এই ধরণের শেনানিগানগুলি অস্বীকার করে - তবে অন্যভাবে - যখন আগদা এই ধরণের এসোসিয়েটিভিটির মিশ্রণের অনুমতি দেয়।


প্রথমত, হাস্কেল-এ , আপনাকে কেবল এটি করার অনুমতি দেওয়া হয় না। আপনি আপনার নিজের অপারেটরগুলি সংজ্ঞায়িত করতে পারেন এবং তাদের পছন্দ (0-9) থেকে অগ্রাধিকার দিতে পারেন এবং আপনার পছন্দসইয়ের সাহচর্যতা দিতে পারেন। তবে, হাস্কেল রিপোর্ট আপনাকে মিশ্রিত মিশ্রণ থেকে নিষেধ করে :

সিনট্যাক্স ত্রুটি এড়াতে একই নজিরযুক্ত ধারাবাহিকভাবে অপরিবর্তিত অপারেটরদের উভয়কেই বাম বা ডান সহযোগী হতে হবে। [হাস্কেল ২০১০ রিপোর্ট, সিএইচ। 3]

সুতরাং, জিএইচসি-তে , আমরা যদি একই অগ্রাধিকার স্তরে একটি বাম-সাহচর্যকারী ( infixl) অপারেটর <@এবং ডান-অ্যাসোসিয়েটিভ অপারেটর সংজ্ঞায়িত @>করি - তবে 0 বলি - তাহলে মূল্যায়ন x <@ y @> zত্রুটি দেয়

প্রাধান্য পার্সিং ত্রুটি
    মিশ্রিত করা যাবে না ' <@' [ infixl 0] এবং ' @>' [ infixr 0একই পোতা এক্সপ্রেশনে]

(আসলে, আপনি অপারেটরটিকে ইনফিক্স হিসাবে ঘোষণা করতে পারেন তবে অ-সাহসী, যেমন ==, যাতে এটি x == y == zএকটি সিনট্যাক্স ত্রুটি হয়!)


অন্যদিকে, নির্ভরশীল-টাইপিত ভাষা / উপপাদ্য প্রবাদ আগদা (যা স্বীকার করে, যথেষ্ট কম মূলধারার)। অজদার কাছে আমার জানা ভাষার যে কোনও ভাষাতে সবচেয়ে মারাত্মক সিনট্যাক্স রয়েছে, মিক্সফিক্স অপারেটরকে সমর্থন করে : স্ট্যান্ডার্ড লাইব্রেরিতে ফাংশনটি রয়েছে

if_then_else_ : ∀ {a} {A : Set a} → Bool → A → A → A

যা বলা হয়, এটি লেখা হয়

if b then t else f

আন্ডারস্কোরগুলিতে যুক্তিগুলি পূরণ করে! আমি এটি উল্লেখ করেছি কারণ এর অর্থ এটি অবিশ্বাস্যরূপে নমনীয় পার্সিং সমর্থন করতে পারে। স্বাভাবিকভাবেই, Agda এছাড়াও (তার প্রাধান্য মাত্রা উপর নির্বিচারে স্বাভাবিক সংখ্যার ব্যাপ্তি এবং 0-100 মধ্যে সাধারণত যদিও) অপরিবর্তন ঘোষণা আছে, এবং Agda করে একই প্রাধান্য কিন্তু বিভিন্ন fixities অপারেটরদের মিশ্রিত করা আপনার অনুমতি দেয়। আমি অবশ্য ডকুমেন্টেশনে এ সম্পর্কিত তথ্য খুঁজে পাচ্ছি না, তাই আমাকে পরীক্ষা-নিরীক্ষা করতে হয়েছিল।

আসুন আমাদের <@এবং @>উপরে থেকে পুনরায় ব্যবহার করুন । দুটি সহজ ক্ষেত্রে, আমাদের আছে

  • x <@ y @> zপার্সিং হিসাবে x <@ (y @> z); এবং
  • x @> y <@ zপার্সিং হিসাবে (x @> y) <@ z

আমি মনে করি যে আগদা যা করে তা হ'ল লাইনটি "বাম সংঘবদ্ধ" এবং "ডান সহযোগী" অংশগুলিতে ভাগ করে, এবং - যতক্ষণ না আমি ভুল বিষয় নিয়ে ভাবছি - ডান-অ্যাসোসিয়েটিভ অংশটি সংলগ্ন যুক্তিগুলি ধরতে "অগ্রাধিকার" পেয়েছে gets যাতে আমাদের দেয়

a <@ b <@ c @> d @> e @> f <@ g

পার্সিং হিসাবে

(((a <@ b) <@ (c @> (d @> (e @> f)))) <@ g

অথবা

<কোড> ((একটি (@ <বি) <@ (সি @> (ডি </ কোড> @> (ই @> চ)))) <@ জি এর পার্স গাছ

যাইহোক, আমার পরীক্ষা-নিরীক্ষা সত্ত্বেও, আমি প্রথমবার এটি লিখেছিলাম বলে ভুল অনুমান করেছি, যা শিক্ষণীয় হতে পারে :-)

(এবং হাস্কেলের মতো আগদারও অ-সহযোগী অপারেটর রয়েছে, যা সঠিকভাবে পার্স ত্রুটি দেয়, সুতরাং মিশ্র সমিতিগুলির পক্ষেও একটি পার্সিং ত্রুটি হতে পারে possible)


অবশেষে, উপপাদ্য-প্রবাদ / নির্ভরশীল-টাইপযুক্ত ভাষা কোক রয়েছে , যার আগদার চেয়ে আরও নমনীয় বাক্য গঠন রয়েছে কারণ এর সিনট্যাক্স এক্সটেনশনগুলি আসলে নতুন সিনট্যাকটিক কনস্ট্রাক্টের জন্য স্পেসিফিকেশন প্রদানের পরে বাস্তবায়িত করা হয় এবং তারপরে এগুলি মূল ভাষায় পুনর্লিখন করে (অস্পষ্টভাবে ম্যাক্রোর মতো) , আমি ধরে নিচ্ছি). কক-তে, তালিকা বাক্য গঠনটি [1; 2; 3]মানক পাঠাগার থেকে .চ্ছিক আমদানি। নতুন সিনট্যাক্সগুলি এমনকি ভেরিয়েবলকে বাঁধতে পারে!

আবারও, কক-এ, আমরা আমাদের নিজস্ব ইনফিক্স অপারেটরগুলি সংজ্ঞায়িত করতে পারি এবং তাদের অগ্রাধিকার স্তর (0-99 থেকে বেশিরভাগ থেকে) এবং এসোসিয়েটিভিটিগুলি দিতে পারি। যাইহোক, কক-এ, প্রতিটি অগ্রাধিকার স্তরের কেবলমাত্র একটি সাহচর্য থাকতে পারে । সুতরাং যদি আমরা <@বাম- সংঘবদ্ধ হিসাবে সংজ্ঞায়িত করি এবং তারপরে @>একই স্তরে ডান-এসোসিয়েটিভ হিসাবে সংজ্ঞায়িত করার চেষ্টা করি - বলুন, 50 - আমরা পেয়েছি

ত্রুটি: 50 স্তরটি ইতিমধ্যে বাম সংঘটিত হিসাবে ঘোষিত হয়েছে যখন এটি এখন ডান সংঘবদ্ধ হিসাবে প্রত্যাশিত

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


2
(জি, ভাষাগুলির কী এক অদ্ভুত নির্বাচন। আপনি কি বলতে পারেন আমি প্রোগ্রামিং ভাষার তত্ত্বটি অধ্যয়ন করতে পারি? :
- পি

আপনার বিস্তারিত উত্তরের জন্য অনেক ধন্যবাদ। বিটিডাব্লু, আপনি কীভাবে ছবিটি graphviz
আঁকলেন

বিটিডাব্লু, "অগ্রাধিকার" পরিবর্তে "স্থিরতা" কেন?
বেসিল স্টারিনকিভিচ

@ বেসাইলস্টারিঙ্কেভিচ: এটি আপনার বোঝার দিকে নির্ভর করে। যদি আপনি কোক বিভাগে বোঝাতে চান, তবে এটি কেবল একটি ভুল ছিল :-) (এবং এটি এখন ঠিক করা হয়েছে!)
আন্টাল স্পেক্টর-জাবুসকি

1
@ বেসাইলস্টারিঙ্কেভিচ: এছাড়াও, ছবিটি সম্পর্কে আপনার প্রশ্নটি আমি মিস করেছি! আমি যে সৃষ্টি লেটেক্ প্যাকেজের সাথে qtree , আর তাতে অনুষ্ঠিত LaTeXit Macs- এর জন্য, একটি লেটেক্ স্নিপেট রেন্ডারার। প্রাসঙ্গিক উত্স কোড ছিল \ttfamily \Tree[.<@ [.<@ [.<@ a b ] [.@> c [.@> d [.@> e f ]]]] g ]
এন্টাল স্পেক্টর-জাবুস্কি

2

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

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

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