জন্য ব্যাকরণ backtracking সঙ্গে recursive বংশদ্ভুত পার্সার


10

ক্যান কেউ আলোকিত আমাকে কেন যে backtracking সঙ্গে একটি recursive বংশদ্ভুত পার্সার চেষ্টা প্রযোজনার এবং এস একটি একটি (যাতে) ব্যাকরণ দ্বারা গঠিত ভাষা না চেনে এস একটি এস একটি | একটি একটিএসএকটিএসএকটিএসএকটিএকটিএসএকটিএসএকটি | একটিএকটি

এটি ভাষা থেকে কেবল শব্দের বিশ্লেষণ করতে দেখা যাচ্ছে {একটি2এন | এন1}

আমি এই বিসিএনএফ পার্সার জেনারেটরটি প্রযোজনার নিয়মের সাহায্যে এই জাতীয় পার্সার তৈরি করেছি এবং উদাহরণস্বরূপ S = "a" S "a" / "aa"পার্সার শব্দটি চিনতে পারে না aaaaaa

আমি এটা প্রকাশনা ব্যবহার করতে আশা পর্যন্ত 7 বাম শুরু থেকে পারসে ট্রি এর টার্মিনাল নোড সংযুক্তকরণের এর, এবং তারপর পারসে ট্রি পর্যন্ত যেতে প্রকাশনা নির্বাচন এস একটি একটি পরিবর্তে গাছ সৌন্দর্য পর্যন্ত এটার মত:এসএকটিএসএকটিaএসএকটিএকটি

   S 
 / | \
a  S  a
 / | \
a  S  a
  / \
 a   a

2
আপনি কেন মনে করেন এটি এই শব্দটিকে বিশ্লেষণ করতে পারে না?
যুবাল ফিল্মাস

@ ইউভাল, আমি মনে করি এটির বিশ্লেষণ করা উচিত, তাই আমার অবশ্যই কিছু মিস করা উচিত।
মেরিবোল্ড

আহ, এখন প্রশ্ন আরও অর্থবোধ করে; সম্পাদনার জন্য ধন্যবাদ! আপনি যা লেখেন তা যদি সত্য হয় (আমি পরীক্ষা করে দেখিনি) জেনারেটরের একটি বাগ রয়েছে বলে মনে হয়। (বা এটি আপনার ব্যাকরণের জন্য নির্দিষ্ট করা হয়নি; আমি ব্যাকরণটি প্রাথমিক এবং দ্ব্যর্থহীন বলে মনে হয় না
রাফেল

@ রাফেল, আমি আবার প্রশ্নটি সম্পাদনা করেছি (আশা করি অর্থটি পরিবর্তন না করে)। এ জাতীয় পার্সার শব্দটি কেন স্বীকৃতি দেয় না তা বোঝাতে আমি আসলেই দায়িত্বপ্রাপ্ত aaaaaa
মেরিবোল্ড

সেই গাছটি কোথায় পেলেন? আমি সেই ABNF পার্সার জেনারেটর থেকে খুব বেশি পাই না। আপনি যে গাছটি দিয়েছেন তা খুব বেশি অর্থবোধ করে না। তবে স্ট্রিংটি aaaaaaবিশ্লেষণ করা উচিত এবং তা নয়। তবে aaaaপার্স করে। আপনি 2 এর শক্তির সম্পর্কে স্পষ্টতই সঠিক The জিনিসটি বাগ করা উচিত। এটি কেবল aaসাথে পার্স করে S = "aa" / "a" [S] "a"। আপনি কীভাবে পার্সারটি আবিষ্কার করতে পারেন?
বাবু

উত্তর:


6

এটি কোনও উত্তরের মতো নয় তবে পার্স গাছগুলি সাধারণ মন্তব্যের সাথে খাপ খায় না।

এসএকটিএসএকটি | একটিএকটিএকটিএকটিএকটিএকটিএকটিএকটি

তবে পার্স গাছটি নিম্নলিখিত রূপ ধারণ করে:

      S 
     /|\
    / S \
   / /|\ \
  / / S \ \
 / / / \ \ \
a a a   a a a

অথবা আপনি যদি এই লাইভ উপস্থাপনাটি পছন্দ করেন তবে বিভিন্ন লাইনে টার্মিনালগুলি রেখে

     S 
   / | \
  a  S  a
   / | \
  a  S  a
    / \
   a   a

আমি পরীক্ষা করে দেখেছি যে এবিএনএফ পার্সার জেনারেটরটি কাজ করছে বলে মনে হচ্ছে না তবে এটি কী করে তা কীভাবে ট্রেস করতে হয় তা আমি জানি না।

{একটি2এন | এন1}

বগি পার্সারের আশেপাশে এরকম একটি বিস্তৃত সাইট পাওয়া কিছুটা অবাক করার মতো বিষয় যা আরও একটি সম্পূর্ণ উদ্বেগজনক পার্সিং কৌশল ব্যবহার করে।


এটি আরও একবার দেখার পরে:

আমি মনে করি সমস্যার একটি উত্স পেয়েছি। বর্গাকার বন্ধনী মানে alচ্ছিক

সুতরাং আপনার ব্যাকরণ লিখতে হবে পারেন S = "a" S "a" / "aa" বা S = "a" [S] "a"। তারপরে এটি সঠিকভাবে কাজ করছে বলে মনে হচ্ছে।

বিভিন্ন রূপে দ্বিগুণ একই নিয়ম থাকার সময় সিস্টেমটি দৃশ্যত হারিয়ে যায়। আমি নিশ্চিত না কেন।

ব্যাকরণ নির্দিষ্ট করার জন্য এই সিনট্যাকটিক সমস্যাগুলির ব্যাখ্যা দেওয়ার জন্য আমি কোনও পৃষ্ঠা পাইনি।

আমি এখনও সেই বগীকে বিবেচনা করি।


1
সেকি। হ্যাঁ। আমি p পার্স ট্রিটি লিখতে গিয়ে কী ভাবছিলাম তা আমি জানি না। আমি আমার প্রশ্নটি সম্পাদনা করব এবং আপনার পেস্ট করব।
মেরিবোল্ড

আমি এখানে একটি অনলাইন ডেমো সহ পার্সার জেনারেটরটিকে অন্য পুনরাবৃত্তির S ::= 'a'<S>'a' | 'a''a'
উত্স থেকে পেয়েছি

এটি aaaaaaব্যবহার করার সময় এখনও বিশ্লেষণ করে না S = "a" S "a" / "aa", তবে বন্ধনীগুলি সম্পর্কে আপনি ঠিক বলে মনে করছেন।
মেরিবোল্ড

পুনরাবৃত্ত বংশোদ্ভূত, ব্যাকট্র্যাকিং পার্সার অন্বেষণের বিন্দুটি আমি দেখতে পাচ্ছি না।
বাবু

আপনি ঠিক বলেছেন S = "a" S "a" / "aa"... আমি খুব দ্রুত পরীক্ষা করেছি এবং পার্সের পরিবর্তে জেনারেটে ক্লিক করেছি।
বাবু

3

s1()এসএকটিএসএকটিtrues()s2()এসএকটিএকটি

aaaaaaআবার শব্দটি বিশ্লেষণের বিষয়টি বিবেচনা করুন । এক পর্যায়ে, পার্স গাছটি দেখতে এমন হবে:

   S 
 / | \
a  S  a
 / | \
a  S  a    <--
 / | \
a  S  a
  / \
 a   a

s()trueSএসএকটিএকটি

   S 
 / | \
a  S  a
  / \
 a   a

যদিও আমি এই বিষয়টি আমার বাস্তবায়নের সাথে বিবেচনা করি এবং সাধারণভাবে ব্যাকট্র্যাকিং পুনরাবৃত্ত বংশদ্ভুত পার্সারদের সাথে নয়।

#include <iostream>

char* next;    
bool term(char token) {
    if (*next != '\0')
        return *next++ == token;
    else
        return false;
}

bool s();    
bool s1() {
    return term('a') && s() && term('a');
}    
bool s2() {
    return term('a') && term('a');
}    
bool s() {
    auto save = next;
    return s1() or (next = save, s2());
}    

int main(int argc, char* argv[]) {
    next = "aaaaaa";
    if (s() && *next == '\0') {
        std::cout << "match";
    }
    else
        std::cout << "no match";
}

2

এটি একটি বৈশিষ্ট্য যা বাগ নয়

কখন এবং কোথায় ব্যাকট্র্যাকিং ঘটে তা ঘনিষ্ঠভাবে দেখুন:

     1.           2.          3.          4.          5.          6.          7.          8.          9.          10.         11.         12.

     S            S           S           S           S           S           S           S           S           S           S           S      
   / | \        / | \       / | \       / | \       / | \       / | \       / | \       / | \       / | \       / | \       / | \       / | \
  a  S  a      a  S  a     a  S  a     a  S  a     a  S  a     a  S  a     a  S  a     a  S  a     a  S  a     a  S  a     a  S  a     a  S  a
                / | \       / | \       / | \       / | \       / | \       / | \       / | \       / | \       / | \       / | \       /   \
               a  S  a     a  S  a     a  S  a     a  S  a     a  S  a     a  S  a     a  S  a     a  S  a     a  S  a     a  S  a     a     a
                            / | \       / | \       / | \       / | \       / | \       / | \       / | \       / | \       / | \
                           a  S  a     a  S  a     a  S  a     a  S  a     a  S  a     a  S  a     a  S  a     a  S  a     a  S  a
                                        / | \       / | \       / | \       / | \       / | \       / | \       / | \       /   \
                                       a  S  a     a  S  a     a  S  a     a  S  a     a  S  a     a  S  a     a  S  a     a     a
                                                    / | \       / | \       / | \       / | \       / | \       /   \
                                                   a  S  a     a  S  a     a  S  a     a  S  a     a  S  a     a     a
                                                                / | \       / | \       / | \       /   \   
                                                               a  S  a     a  S  a     a  S  a     a     a
                                                                            / | \       /   \
                                                                           a  S  a     a     a



w[] = 'aaaaaa'  //input
l[] = ''        //current tree leafs


 1. tree:   The parser starts with the start symbol S and tries first alternative S->aSa:       Result: w[0]  = l[0]     w = aaaaaa    l = aSa
 |          -- S->aSa works                                                                         | |     | | 
 6. tree:   The parser matches a after a:                                                       Result: w[6]  = l[6]     w = aaaaaa    l = aaaaaaSaaaaaa
 7. tree:   The parser tries S->aSa again but there is no match!                                Result: w[7] != l[7]     w = aaaaaa    l = aaaaaaaSaaaaaaa 
 8. tree:   The parser tries S->aa but there is still no match!                                 Result: w[7] != l[7]     w = aaaaaa    l = aaaaaaaaaaaaaa
 9. tree:   Backtracking after the last symbol that matched => Backtracking at l[7]             Result: w[7] != l[7]     w = aaaaaa    l = aaaaaaaaaaaa
10. tree:   Backtracking after the last symbol that matched => Backtracking at l[7]             Result: w[7] != l[7]     w = aaaaaa    l = aaaaaaaaaa
11. tree:   Backtracking after the last symbol that matched => Backtracking at l[7]             Result: w[7] != l[7]     w = aaaaaa    l = aaaaaaaa
12. tree:   Backtracking after the last symbol that matched => Backtracking at l[7]             Result: w[7] != l[7]     w = aaaaaa    l = aaaa

এখানে গুরুত্বপূর্ণ বিষয়টি হল অবস্থানের পরে পার্সার ব্যাকট্র্যাকগুলি যেখানে সর্বশেষ মিলের অক্ষরটি পাওয়া গেছে। কেন এটা গাছ 11 থেকে "জাম্প" সঙ্গে যে ঠ = aaaaaaaa সঙ্গে 12th গাছকে ঠ = আসলে কিসের এ ভয় ব্যবহার করে > এএ - এস ঠ [7] এ।


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