আমি নির্ধারিত কিছু এক্সেলের মতো সূত্রগুলি বিশ্লেষণের জন্য একটি ব্যাকরণ তৈরি করার চেষ্টা করছি, যেখানে স্ট্রিংয়ের শুরুতে একটি বিশেষ চরিত্র একটি ভিন্ন উত্সকে ইঙ্গিত করে। উদাহরণস্বরূপ, $
একটি স্ট্রিংকে ইঙ্গিত $This is text
করতে পারে , সুতরাং প্রোগ্রামে একটি " " স্ট্রিং ইনপুট হিসাবে বিবেচিত হবে এবং &
একটি ফাংশনকে বোঝাতে পারে, তাই &foo()
অভ্যন্তরীণ ফাংশনে একটি কল হিসাবে বিবেচনা করা যেতে পারে foo
।
ব্যাকরণটি কীভাবে সঠিকভাবে তৈরি করা যায় তা হ'ল আমি যে সমস্যার মুখোমুখি হচ্ছি is উদাহরণস্বরূপ, এটি এমডাব্লুইই হিসাবে একটি সরলীকৃত সংস্করণ:
grammar = r'''start: instruction
?instruction: simple
| func
STARTSYMBOL: "!"|"#"|"$"|"&"|"~"
SINGLESTR: (LETTER+|DIGIT+|"_"|" ")*
simple: STARTSYMBOL [SINGLESTR] (WORDSEP SINGLESTR)*
ARGSEP: ",," // argument separator
WORDSEP: "," // word separator
CONDSEP: ";;" // condition separator
STAR: "*"
func: STARTSYMBOL SINGLESTR "(" [simple|func] (ARGSEP simple|func)* ")"
%import common.LETTER
%import common.WORD
%import common.DIGIT
%ignore ARGSEP
%ignore WORDSEP
'''
parser = lark.Lark(grammar, parser='earley')
তো, এই ব্যাকরণ সঙ্গে, ভালো জিনিস: $This is a string
, &foo()
, &foo(#arg1)
, &foo($arg1,,#arg2)
এবং &foo(!w1,w2,w3,,!w4,w5,w6)
সব আশানুরূপ পার্স করা হয়। তবে আমি যদি আমার simple
টার্মিনালের সাথে আরও নমনীয়তা যুক্ত করতে চাই , তবে SINGLESTR
টোকেন সংজ্ঞাটি যা আপনার পক্ষে সুবিধাজনক নয় তা দিয়ে আমার চারপাশে ফিডিং শুরু করা দরকার ।
আমি কি চেষ্টা করেছি
আমি যে অংশটি অতীত হতে পারি না তা হ'ল যদি আমি বন্ধনী (যা আক্ষরিক func
) সহ একটি স্ট্রিং রাখতে চাই , তবে আমি আমার বর্তমান পরিস্থিতিতে সেগুলি পরিচালনা করতে পারি না।
- তাহলে আমি প্রথম বন্ধনী যোগ
SINGLESTR
তারপর, আমি পেতেExpected STARTSYMBOL
কারণ এটি সঙ্গে মিশ্রিত হয়ে যাচ্ছে,func
সংজ্ঞা এবং এটি মনে করেন যে একটি ফাংশন যুক্তি পাস করা উচিত, যা জ্ঞান করে তোলে। - আমি যদি কেবলমাত্র ক্রিয়াকলাপের জন্য এম্পারস্যান্ড প্রতীক সংরক্ষণ করার জন্য ব্যাকরণটিকে পুনরায় সংজ্ঞায়িত করি এবং এর মধ্যে প্রথম বন্ধনী যুক্ত
SINGLESTR
করি, তবে আমি প্রথম বন্ধনীর সাথে একটি স্ট্রিং পার্স করতে পারি, তবে প্রতিটি ফাংশন যা আমি বিশ্লেষণের চেষ্টা করছিExpected LPAR
।
আমার উদ্দেশ্য হ'ল একটি দিয়ে শুরু হওয়া যে কোনও কিছুই টোকেন $
হিসাবে পার্স করা হবে SINGLESTR
এবং তারপরে আমি পছন্দ মতো জিনিসগুলি পার্স করতে পারি &foo($first arg (has) parentheses,,$second arg)
।
আমার সমাধান, আপাতত, আমি আমার স্ট্রিংগুলিতে LEFTPAR এবং RIGHTPAR এর মতো 'পলায়ন' শব্দ ব্যবহার করছি এবং আমি যখন গাছটি প্রসেস করি তখন সেগুলি বন্ধনীতে পরিণত করতে সহায়ক ফাংশন লিখেছি। সুতরাং, $This is a LEFTPARtestRIGHTPAR
সঠিক গাছ উত্পাদন করে এবং যখন আমি এটি প্রক্রিয়া করি, তখন এটি অনুবাদ হয় This is a (test)
।
একটি সাধারণ প্রশ্ন গঠনের জন্য: আমি কীভাবে আমার ব্যাকরণটি এমনভাবে সংজ্ঞায়িত করতে পারি যে ব্যাকরণের বিশেষ কিছু চরিত্রকে কিছু পরিস্থিতিতে স্বাভাবিক চরিত্র হিসাবে বিবেচনা করা হয় এবং অন্য কোনও ক্ষেত্রে বিশেষ হিসাবে বিবেচনা করা হয়?
সম্পাদনা 1
একটি মন্তব্য উপর ভিত্তি করে থেকে jbndlr
আমি পৃথক শুরু প্রতীক উপর ভিত্তি করে মোড তৈরি করতে আমার ব্যাকরণ সংশোধিত:
grammar = r'''start: instruction
?instruction: simple
| func
SINGLESTR: (LETTER+|DIGIT+|"_"|" ") (LETTER+|DIGIT+|"_"|" "|"("|")")*
FUNCNAME: (LETTER+) (LETTER+|DIGIT+|"_")* // no parentheses allowed in the func name
DB: "!" SINGLESTR (WORDSEP SINGLESTR)*
TEXT: "$" SINGLESTR
MD: "#" SINGLESTR
simple: TEXT|DB|MD
ARGSEP: ",," // argument separator
WORDSEP: "," // word separator
CONDSEP: ";;" // condition separator
STAR: "*"
func: "&" FUNCNAME "(" [simple|func] (ARGSEP simple|func)* ")"
%import common.LETTER
%import common.WORD
%import common.DIGIT
%ignore ARGSEP
%ignore WORDSEP
'''
এটি আমার দ্বিতীয় পরীক্ষার মামলার অধীনে (কিছুটা) পড়েছে। আমি সমস্ত simple
ধরণের স্ট্রিং (পাঠ্য, এমডি বা ডিবি টোকেন যাতে প্রথম বন্ধনী থাকতে পারে) এবং ফাঁকা ফাঁকা ফাংশন পার্স করতে পারি ; উদাহরণস্বরূপ, &foo()
বা &foo(&bar())
সঠিকভাবে বিশ্লেষণ করুন। যে মুহুর্তে আমি কোনও ফাংশনের মধ্যে আর্গুমেন্ট রাখি (কোনও ধরণের বিষয় নয়), আমি একটি পেয়ে যাই UnexpectedEOF Error: Expected ampersand, RPAR or ARGSEP
। ধারণার প্রমাণ হিসাবে, আমি যদি উপরের নতুন ব্যাকরণে SINGLESTR সংজ্ঞা থেকে বন্ধনীগুলি সরিয়ে ফেলি, তবে সবকিছু যেমনটি করা উচিত তেমন কাজ করে, তবে আমি আবার স্কোয়ার একে ফিরে এসেছি।
STARTSYMBOL
) পরে কী ঘটছে তা চিহ্নিত করে এবং আপনি পৃথককারী এবং প্রথম বন্ধনী যুক্ত করেছেন যেখানে পরিষ্কার হওয়া দরকার; আমি এখানে কোনও অস্পষ্টতা দেখছি না।STARTSYMBOL
স্বতন্ত্র হওয়ার জন্য আপনাকে নিজের তালিকাটি পৃথক আইটেমগুলিতে বিভক্ত করতে হবে।