একটি হাস্কেল পার্সার কি ইউনিকোড অঙ্কগুলিকে সংখ্যাসূচক অক্ষরে অনুমতি দেবে?


15

অনুশীলন হিসাবে, আমি স্ক্র্যাচ থেকে হাস্কেলের পক্ষে একটি পার্সার লিখছি। লিক্সার তৈরি করার সময়, আমি হাসেল 2010 রিপোর্টে নিম্নলিখিত বিধিগুলি লক্ষ্য করেছি :

সংখ্যাascDigit | uniDigit
ascDigit0| 1| … | 9
ইউনিডিজিট → যে কোনও ইউনিকোড দশমিক অঙ্কের
অক্টিট0| 1| … | 7
হেক্সিটডিজিট | A| … | F| a| … |f

দশমিকঅঙ্ক { অঙ্ক }
অকট্যালoctit { octit }
হেক্সাডেসিমেলhexit { hexit }

পূর্ণসংখ্যাদশমিক | 0o অষ্টাল | 0O অষ্টাল | 0x হেক্সাডেসিমাল | 0X হেক্সাডেসিমাল
ভাসাদশমিক . দশমিক [ অভিজাত ] | দশমিক ব্যয়কারী
exp ( e| E) [ +| -] দশমিক

ডেসিমাল এবং হেক্সাডেসিমেল লিটারেল, ভাসা লিটারেল সহ, সব উপর ভিত্তি করে অঙ্ক , যা কোন ইউনিকোড দশমিক অঙ্ক স্বীকার করেন, পরিবর্তে ascDigit , যা শুধুমাত্র মৌলিক সংখ্যার 0-9 হওয়া ASCII থেকে স্বীকার করে। স্ট্রেঞ্জলি, অকট্যাল উপর ভিত্তি করে তৈরি octit , যা পরিবর্তে শুধুমাত্র স্বীকার হওয়া ASCII সংখ্যা 0-7। আমি অনুমান করব যে এই "ইউনিকোড দশমিক সংখ্যা" হ'ল "এনডি" সাধারণ বিভাগ সহ কোনও ইউনিকোড কোডপয়েন্ট। তবে এর মধ্যে পূর্ণ-প্রস্থের অঙ্কগুলি 0-9 এবং দেবনাগরী সংখ্যাসমূহ -০ ० এর মতো অক্ষর অন্তর্ভুক্ত রয়েছে ९ দেখতে পাচ্ছি কেন এটা এই শনাক্তকারী মধ্যে করার অনুমতি কাম্য হতে পারে, কিন্তু আমি এক, যার ফলে লিখতে জন্য কোন সুবিধা সবটা দেখতে পারেন ९0আক্ষরিক জন্য 90

জিএইচসি আমার সাথে একমত বলে মনে হচ্ছে। আমি যখন এই ফাইলটি সংকলনের চেষ্টা করি,

module DigitTest where
x1 = 

এটি এই ত্রুটি আউট spits।

digitTest1.hs:2:6: error: lexical error at character '\65297'
  |
2 | x1 = 
  |      ^

তবে, এই ফাইল

module DigitTest where
x = 1

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


4
হাস্যকর. আমি সন্দেহ করি এটি "ঠিক আছে, তাই আক্ষরিক মধ্যে কেবল ASCII ডিজিট সমন্বিত, সহজ" এর মতো কিছু সম্পর্কে এসেছে। "থামো না, আন্তর্জাতিকীকরণের কথা ভাবি, ইউনিকোড ... তাদেরও অন্যান্য ডিজিটাল চিহ্ন রয়েছে, তাই না?" "ওহ হ্যাঁ, হ্যাঁ, কখনই এর সাথে ডিল করেনি ... তবে ঠিক আছে, এর জন্য একটি ধারা useোকানো যাক ..." "দুর্দান্ত।" ... এবং তারপরে এটি কেবল ভুলে গিয়েছিল এবং বাস্তবে কেউ এটিকে বাস্তবায়িত করতে কখনই বিরক্ত করেনি বা লক্ষ্য করেছেন যে অঙ্কের বিভিন্ন পরিবারকে মিশ্রিত করার পক্ষে তা বোঝা যায় না।
বাম দিকের

বাবা। হ্যাঁ, এটি নিয়ে বিরক্ত করবেন না।
বোয়ান

উত্তর:


8

জিএইচসি উত্স কোড ফাইলটিতে compiler/parser/Lexer.xআপনি নিম্নলিখিত কোডটি সন্ধান করতে পারেন:

ascdigit  = 0-9
$unidigit  = \x03 -- Trick Alex into handling Unicode. See [Unicode in Alex].
$decdigit  = $ascdigit -- for now, should really be $digit (ToDo)
$digit     = [$ascdigit $unidigit]
...
$binit     = 0-1
$octit     = 0-7
$hexit     = [$decdigit A-F a-f]
...
@numspc       = _*                   -- numeric spacer (#14473)
@decimal      = $decdigit(@numspc $decdigit)*
@binary       = $binit(@numspc $binit)*
@octal        = $octit(@numspc $octit)*
@hexadecimal  = $hexit(@numspc $hexit)*
@exponent     = @numspc [eE] [\-\+]? @decimal
@bin_exponent = @numspc [pP] [\-\+]? @decimal

এখানে, $decdigitদশমিক এবং হেক্সাডেসিমাল লিটারালগুলি (এবং তাদের ভাসমান বিন্দুর রূপগুলি) পার্স করার $digitজন্য ব্যবহৃত হয় , যখন আলফানিউমেরিক সনাক্তকারীদের "সংখ্যাসূচক" অংশের জন্য ব্যবহৃত হয়। "টুডো" নোটটি এটি পরিষ্কার করে দেয় যে এটি ভাষা মান থেকে জিএইচসির একটি স্বীকৃত বিচ্যুতি।

সুতরাং, আপনি অনুমানটি সঠিকভাবে পড়ছেন, এবং জিএইচসি আধা-ইচ্ছাকৃতভাবে চক্রটি লঙ্ঘন করছে। একটি উন্মুক্ত টিকিট আছে যা কমপক্ষে বিচ্যুতির দলিল করার পরামর্শ দেয়, তবে আমি মনে করি না যে কারওাই এটি ঠিক করতে কোনও আগ্রহ প্রকাশ করেছেন।


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