একটি বিমূর্ত সিনট্যাক্স ট্রি এবং একটি কংক্রিট সিনট্যাক্স গাছের মধ্যে পার্থক্য কী?


85

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

এমন কিছু আছে যা আমি শব্দার্থবিজ্ঞান বিশ্লেষক সম্পর্কে অনুপস্থিত, বা এটিএসটি এবং সিএসটি কিছুটা কৃত্রিম?

উত্তর:


65

একটি কংক্রিট সিনট্যাক্স ট্রি উত্স পাঠ্যের ঠিক পার্সড আকারে প্রতিনিধিত্ব করে। সাধারণভাবে, এটি উত্স-ভাষা ব্যাকরণটি বিন্যাস-মুক্ত ব্যাকরণের সাথে সামঞ্জস্য করে।

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

আপনার সাধারণত একটি কংক্রিট সিনট্যাক্স ট্রি তৈরি করার প্রয়োজন হয় না। আপনার ওয়াইএসিসির ক্রিয়া রুটিনগুলি (বা অ্যান্টলার, বা মেনহির, বা যাই হোক না কেন ...) ব্যাকরণ সরাসরি বিমূর্ত সিনট্যাক্স ট্রি তৈরি করতে পারে, সুতরাং কংক্রিট সিনট্যাক্স ট্রি কেবলমাত্র আপনার উত্স পাঠ্যের পার্স কাঠামোর প্রতিনিধিত্ব করে এমন একটি ধারণাগত সত্তা হিসাবে উপস্থিত।


4
পরিপূরক: পাইথন ইন্টারপ্রেটার প্রথমে একটি সিএসটি তৈরি করে তারপরে এএসটিতে রূপান্তর করে।
cgsdfc

34

একটি কংক্রিট সিনট্যাক্স ট্রি ব্যাকরণের নিয়ম যা বলে তার সাথে মেলে the বিমূর্ত সিনট্যাক্স ট্রিটির উদ্দেশ্য "সিনট্যাক্স ট্রি" এর মধ্যে যা প্রয়োজনীয় তা একটি "সাধারণ" উপস্থাপনা।

এএসটি আইএমএইচএ-র একটি আসল মান হ'ল এটি সিএসটি-র চেয়ে ছোট এবং তাই প্রক্রিয়া করতে কম সময় নেয়। (আপনি বলতে পারেন, কে যত্ন করে? তবে আমি এমন একটি সরঞ্জাম নিয়ে কাজ করি যেখানে আমাদের লক্ষ লক্ষ নোড একসাথে থাকে!)।

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

তবে এই জাতীয় এএসটি থাকার কারণে এমন সমস্যা তৈরি হয় যা ছিল না: এটি ব্যাকরণের সাথে মেলে না এবং এখন আপনাকে উভয়কেই মানসিকভাবে ট্র্যাক করতে হবে। এবং যখন 3500 রুল ব্যাকরণের জন্য 1500 এএসটি নোড থাকে, তখন এটি অনেক গুরুত্বপূর্ণ। এবং যদি ব্যাকরণটি বিকশিত হয় (তারা সর্বদা করে!), এখন আপনার কাছে দুটি সমন্বয়যুক্ত সেট সেট থাকে have

আরেকটি সমাধান হ'ল পার্সারটিকে কেবল আপনার জন্য সিএসটি নোড তৈরি করতে দিন এবং সেগুলি কেবল ব্যবহার করুন। ব্যাকরণ তৈরি করার সময় এটি একটি বিশাল সুবিধা: 3500 ব্যাকরণের নিয়মগুলি মডেল করার জন্য 1500 টি বিশেষ এএসটি নোড আবিষ্কার করার দরকার নেই। গাছটি ব্যাকরণের থেকে বিচ্ছিন্ন হওয়ার কথা চিন্তা করুন। ব্যাকরণ প্রকৌশলের দৃষ্টিকোণ থেকে এটি সম্পূর্ণ মস্তিষ্কহীন, যা তাকে ব্যাকরণটি সঠিকভাবে পেতে এবং তার হৃদয়ের বিষয়বস্তুটিতে হ্যাক করার দিকে মনোনিবেশ করতে দেয়। যুক্তিযুক্তভাবে আপনাকে আরও নোড ভিজিটর বিধি লিখতে হবে, তবে এটি পরিচালনা করা যায়। এই সম্পর্কে আরও পরে।

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

    L = e ;
    L = L e ;
    L2 = e2 ;
    L2 = L2  ','  e2 ;

এবং এই ধরনের ফর্মের বিভিন্ন ধরণের। আপনি ব্যাকরণের নিয়ম এবং ভার্চুয়াল সিএসটি হিসাবে বিবেচনা করুন; সরঞ্জামটি সংকুচিত প্রতিনিধিত্ব করে on আপনার মস্তিষ্কে সহজ, রানটাইমে দ্রুত / আরও ছোট।

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

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

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

নীচের লাইন: এএসটিগুলি ফিসিসিল এবং ধারণাগত উভয়ের জন্যই ছোট for সিএসটি থেকে অটোমেটেড এএসটি নির্মাণ উভয়ই সরবরাহ করে এবং আপনাকে দুটি পৃথক সেট ট্র্যাকিংয়ের সমস্যা এড়াতে দেয়।

মার্চ ২০১ 2015 সম্পাদনা করুন: সিএসটি বনাম "এএসটি" তৈরির উদাহরণগুলির লিঙ্ক this


25

এটি টেরেন্স পারর দ্বারা প্রকাশিত মূল্যায়ন ব্যাকরণের উপর ভিত্তি করে ।

উদাহরণস্বরূপ ব্যাকরণ:

grammar Expr002;

options 
{
    output=AST;
    ASTLabelType=CommonTree; // type of $stat.tree ref etc...
}

prog    :   ( stat )+ ;

stat    :   expr NEWLINE        -> expr
        |   ID '=' expr NEWLINE -> ^('=' ID expr)
        |   NEWLINE             ->
        ;

expr    :   multExpr (( '+'^ | '-'^ ) multExpr)*
        ; 

multExpr
        :   atom ('*'^ atom)*
        ; 

atom    :   INT 
        |   ID
        |   '('! expr ')'!
        ;

ID      : ('a'..'z' | 'A'..'Z' )+ ;
INT     : '0'..'9'+ ;
NEWLINE : '\r'? '\n' ;
WS      : ( ' ' | '\t' )+ { skip(); } ;

ইনপুট

x=1
y=2
3*(x+y)

পার্স গাছ

পার্স গাছটি ইনপুটটির একটি দৃ a় প্রতিনিধিত্ব। পার্স গাছটি ইনপুটটির সমস্ত তথ্য ধরে রাখে। খালি বাক্সগুলি হোয়াইটস্পেসের প্রতিনিধিত্ব করে, মানে লাইনের শেষ।

পার্স গাছ

এএসটি

এএসটি ইনপুটটির একটি বিমূর্ত উপস্থাপনা। লক্ষ করুন যে পেরেনগুলি এএসটিতে উপস্থিত নেই কারণ সমিতিগুলি গাছের কাঠামো থেকে উদ্ভূত।

এএসটি

সম্পাদনা

ব্যাখ্যার মাধ্যমে আরও তথ্যের জন্য কম্পাইলার এবং সংকলক জেনারেটর pg দেখুন। 23


20

এই ব্লগ পোস্ট সহায়ক হতে পারে।

আমার কাছে মনে হয় যে এএসটি প্রচুর মধ্যবর্তী ব্যাকরণগত / কাঠামোগত তথ্য যা শব্দার্থকে অবদান রাখবে না " উদাহরণস্বরূপ, আপনি খেয়াল করেন না যে 3 একটি পরমাণু হল একটি শব্দ একটি উপাদান হয় .... আপনি কেবল খেয়াল রাখবেন যে 3আপনি যখন ক্ষয়ক্ষতি প্রকাশ বা যে কোনও কিছুই প্রয়োগ করছেন implementing


9

কংক্রিট বাক্য গঠন গাছ ভাষার ব্যাকরণ নিয়ম অনুসরণ করে। ব্যাকরণে, "এক্সপ্রেশন তালিকাগুলি" সাধারণত দুটি নিয়মের সাথে সংজ্ঞায়িত হয়

  • এক্সপ্রেশন_লিস্ট হতে পারে: এক্সপ্রেশন
  • এক্সপ্রেশন_লিস্ট হতে পারে: এক্সপ্রেশন, এক্সপ্রেশন_লিস্ট

আক্ষরিকভাবে অনুসরণ করা, এই দুটি নিয়ম প্রোগ্রামে প্রদর্শিত যে কোনও এক্সপ্রেশন তালিকায় একটি ঝুঁটি আকার দেয়।

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


2

সহজভাবে, এএসটি কেবল কোডটির শব্দার্থবিজ্ঞান ধারণ করে, পার্স ট্রি / সিএসটিও ঠিক কোড কীভাবে রচিত হয়েছিল সে সম্পর্কিত তথ্যও অন্তর্ভুক্ত করে।


1

কংক্রিট সিনট্যাক্স ট্রিটিতে অতিরিক্ত পরিমাণে প্রথম বন্ধনী এবং সাদা স্থান এবং মন্তব্যগুলির মতো সমস্ত তথ্য রয়েছে, বিমূর্ত সিনট্যাক্স ট্রি এই তথ্য থেকে দূরে থাকে।

 

এনবি: যথেষ্ট মজার, আপনি যখন একটি রিফ্যাক্টরিং ইঞ্জিন প্রয়োগ করেন তখন আপনার এএসটি আবার সমস্ত কংক্রিটের তথ্য রাখবে, তবে আপনি এএসটি হিসাবে এটি উল্লেখ করতে থাকবেন কারণ এটি ক্ষেত্রের মানক পদে পরিণত হয়েছে (তাই কেউ বলতে পারে এটি দীর্ঘ হয়েছে) পূর্বে এর আসল অর্থটি হারিয়েছে)।


ভাল, এটিতে সমস্ত কংক্রিটের তথ্য নাও থাকতে পারে। যা প্রয়োজন তা হ'ল এটি সেই তথ্যটিকে নতুন করে তৈরি করতে সক্ষম হবে। আমার উত্তর দেখুন।
ইরা বাক্সার

গতকাল মন্তব্য? বা বাগ বা এমন কোনও মন্তব্য নেक्रोমেন্সার ব্যাজ উপার্জন করতে হবে যা আমি জানিনা? :) (পিএস: তবে আপনার কাছ থেকে শুনে ভালো লাগল, আপনি সবেমাত্র
ডিএমএসে

1

এটি একটি পার্থক্য যা কোনও পার্থক্য করে না।

একটি এএসটি সাধারণত বর্ণসুলভ বিষয়বস্তু ফেলে দিয়ে প্রোগ্রামিং ভাষার প্রকাশের শব্দার্থের অনুমানের উপায় হিসাবে ব্যাখ্যা করা হয়। উদাহরণস্বরূপ একটি প্রসঙ্গে বিনামূল্যে ব্যাকরণে আপনি নিম্নলিখিত EBNF বিধি লিখতে পারেন

term: atom (('*' | '/') term )*

যদিও এএসটি ক্ষেত্রে আপনি কেবল mul_rule এবং Div_rule ব্যবহার করেন যা সঠিক গাণিতিক ক্রিয়াকে প্রকাশ করে।

সেই নিয়মগুলি কি ব্যাকরণে প্রথমে চালু করা যায় না? অবশ্যই. উল্লিখিত এএসটি নোডগুলি অনুকরণ করার জন্য ব্যবহৃত একটি আরও কংক্রিট নিয়মে এটি ভেঙে আপনি উপরের কমপ্যাক্ট এবং বিমূর্ত বিধিটিকে পুনরায় লিখতে পারেন :

term: mul_rule | div_rule
mul_rule: atom ('*' term)*
div_rule: atom ('/' term)*

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

সুতরাং এএসটিগুলি একটি অ্যাডহক পরিপূরক যা ব্যাকরণ এবং পার্সারগুলির ঘাটতিগুলি সমাধান করার জন্য ব্যবহৃত হয়। সিএসটি -> এএসটি রূপান্তরটি একটি রিফ্যাক্টরিং পদক্ষেপ। কোনও অতিরিক্ত কমা বা কোলন সিনট্যাক্স ট্রিে সংরক্ষণ করা হয় তা কেউ কখনও বিরক্ত করেনি। বিপরীতে কিছু লেখক এএসটিগুলিতে তাদের পুনঃপ্রতিষ্ঠা করেন কারণ তারা একই সাথে বিভিন্ন গাছ বজায় রাখার পরিবর্তে রিফ্যাক্টরিংয়ের জন্য এএসটি ব্যবহার করতে চান বা একটি অতিরিক্ত অনুমান ইঞ্জিন লিখতে চান। প্রোগ্রামাররা ভাল কারণে অলস হয়। প্রকৃতপক্ষে তারা ত্রুটি প্রতিবেদনের জন্য এএসটিগুলিতে লেজিক বিশ্লেষণ দ্বারা সংগৃহীত এমনকি লাইন এবং কলামের তথ্য সঞ্চয় করে। সত্যিই খুব বিমূর্ত।


0

সিএসটি (কংক্রিট সিনট্যাক্স ট্রি) হল ব্যাকরণের একটি গাছের উপস্থাপনা (প্রোগ্রামটি কীভাবে লিখতে হবে তার বিধি)। সংকলক আর্কিটেকচারের উপর নির্ভর করে এটি পার্সার একটি এএসটি উত্পাদন করতে ব্যবহার করতে পারে।

এএসটি (অ্যাবস্ট্রাক্ট সিনট্যাক্স ট্রি) সংকলকের পার্সার অংশ দ্বারা উত্পাদিত পার্সড উত্সের একটি গাছের উপস্থাপনা। এটি টোকেন + ব্যাকরণ সম্পর্কে তথ্য সঞ্চয় করে।

আপনার সংকলকের আর্কিটেকচারের উপর নির্ভর করে, সিএসটি একটি এএসটি উত্পাদন করতে ব্যবহার করা যেতে পারে। এটা বলা ঠিক যে সিএসটি এএসটিতে বিবর্তিত হয়েছে। বা, এএসটি একটি সমৃদ্ধ সিএসটি।

আরও ব্যাখ্যা এই লিঙ্কটিতে পাওয়া যাবে: http://eli.thegreenplace.net/2009/02/16/abstract-vs-concrete-syntax-trees#id6


4
আমি মনে করি বিশেষত "সরলীকৃত" এর উপর এইগুলির স্পষ্টতা দরকার I আমি একে কমপক্ষে ধারণামূলকভাবে "জটিল" হিসাবে দেখতে চাই যা বিপরীত, এবং এখনও কার্যকর কিছু বর্ণনা করে না।
জোশুয়া হেজেস

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