আপনি যখন ব্যাকরণ ডিবাগারটি ব্যবহার করেন, এটি আপনাকে ইঞ্জিনটি কীভাবে স্ট্রিংটিকে পার্স করছে তা ঠিক দেখতে দেয় - ব্যর্থতা স্বাভাবিক এবং প্রত্যাশিত। বিবেচনা করুন, উদাহরণস্বরূপ, মিলে a+b*
স্ট্রিং সঙ্গে aab
। আপনার 'এ' এর জন্য দুটি ম্যাচ পাওয়া উচিত, তার পরে একটি ব্যর্থ (কারণ b
তা নয় a
) তবে এটি আবার চেষ্টা করে b
সফলতার সাথে মিলবে match
আপনি যদি কোনও বিকল্প পরিবর্তন করেন ||
(যা আদেশ প্রয়োগ করে) তবে এটি আরও সহজেই দেখা যাবে । যদি তোমার থাকে
token TOP { I have a <fruit> }
token fruit { apple || orange || kiwi }
এবং আপনি "আমার কাছে একটি কিউই" বাক্যটি বিশ্লেষণ করুন, আপনি এটি প্রথম ম্যাচটি দেখতে পাবে "আমার একটি আছে", তারপরে "আপেল" এবং "কমলা" দিয়ে দুটি ব্যর্থ হবে এবং শেষ পর্যন্ত "কিউই" এর সাথে একটি ম্যাচ হবে।
এখন আসুন আপনার কেসটি দেখুন:
TOP # Trying to match top (need >1 match of score)
| score # Trying to match score (need >1 match of lc/uc)
| | lc # Trying to match lc
| | * MATCH "a" # lc had a successful match! ("a")
| * MATCH "a " # and as a result so did score! ("a ")
| score # Trying to match score again (because <score>+)
| | lc # Trying to match lc
| | * MATCH "b" # lc had a successful match! ("b")
| * MATCH "b " # and as a result so did score! ("b ")
…………… # …so forth and so on until…
| score # Trying to match score again (because <score>+)
| | uc # Trying to match uc
| | * MATCH "G" # uc had a successful match! ("G")
| * MATCH "G\n" # and as a result, so did score! ("G\n")
| score # Trying to match *score* again (because <score>+)
| * FAIL # failed to match score, because no lc/uc.
|
| # <-------------- At this point, the question is, did TOP match?
| # Remember, TOP is <score>+, so we match TOP if there
| # was at least one <score> token that matched, there was so...
|
* MATCH "a b c d e f g\nA B C D E F G\n" # this is the TOP match
এখানে ব্যর্থতা সাধারণ: এক পর্যায়ে আমরা <score>
টোকেনের বাইরে চলে যাব , সুতরাং একটি ব্যর্থতা অনিবার্য। যখন এটি ঘটে, ব্যাকরণ ইঞ্জিনটি <score>+
আপনার ব্যাকরণের পরে যা কিছু আসে তার দিকে যেতে পারে । যেহেতু কিছুই নেই, এটি ব্যর্থতার ফলে পুরো স্ট্রিংয়ের TOP
মিল হয় (কারণ অন্তর্নিহিতগুলির সাথে মিল রয়েছে /^…$/
)।
এছাড়াও, আপনি নিজের ব্যাকরণটি এমন নিয়ম দিয়ে পুনরায় লেখার বিষয়ে বিবেচনা করতে পারেন যা <.ws> * স্বয়ংক্রিয়ভাবে সন্নিবেশ করায় (যদি না এটি কেবলমাত্র একক স্থান হিসাবে গুরুত্বপূর্ণ):
grammar test {
rule TOP { <score>+ }
token score {
[
| <uc>
| <lc>
]+
}
token uc { <[A..G]> }
token lc { <[a..g]> }
}
আরও, আইএমই, আপনি ইউসি / এলসি-র জন্য একটি প্রোটোক টোকেন যুক্ত করতেও চাইতে পারেন, কারণ আপনার যখন [ <foo> | <bar> ]
সর্বদা থাকে তখন তাদের মধ্যে একটি অপরিবর্তিত থাকবে যা তাদের ক্রিয়াকলাপে প্রক্রিয়াকরণকে কিছুটা বিরক্তিকর করে তুলতে পারে। আপনি চেষ্টা করতে পারেন:
grammar test {
rule TOP { <score> + }
token score { <letter> + }
proto token letter { * }
token letter:uc { <[A..G]> }
token letter:lc { <[a..g]> }
}
$<letter>
সর্বদা এইভাবে সংজ্ঞায়িত করা হবে।