الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

Parse Functions Form String

بدأه Moudey في 3 نوفمبر 2008 · 7 رد · 778 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكــم ورحمـة الله وبركاتــة

لدى تسلسل هرمى من الاجراءات والدوال داخل نص ممثله على النحو التالى

char* func = "@if(@FileExists('app.exe'), @exec('app.exe', 'args', 0), @MsgBox('error'))";

كيف يمكن تحليل هذه التسلسل وتحويله الى كود فعلى؟

مواضيع متنوعة

#2

اخى مودى , على حسب ما فهمت أنك تريد عمل Parsing لـ نص موجود فى String , لتحويله الى كود

فى هذا المشروع : مشروع رسم المعادلات الرياضية , قابلتنا هذه المشكلة و هى اننا نريد ان نحول نص الى دوال رياضية فوجدنا الحل فى استعمال أحد لغات الـ Scripting , و قررنا استخدام لغة ECMAScript و الحمد لله نفذت المطلوب منها على وجه الدقة .

ECMAScript

Qt & ECMAScript

وفقك الله

تم تعديل هذه المشاركة بواسطة Omar Eladel في 3 نوفمبر 2008 في 14:11

#3

شكراً اخى Omar Eladel

نعم توجد مكونات كثيره فى هذا المجال منها ECMAScript , spirit

لكن كيف اقوم ببناء lexeme او parser مخصص لتلك الاجراءات بدون مكونات اخرى.

مواضيع متنوعة

#4

اخى مودى ,, ممكن تطلع على الصنف Parser فى رابط المشروع : هنا

و لكن انصحك اولا ان تبدأ فى القراءة عن لغة الـ Script اولا ثم تبدأ فى قراءة الكود

الفكرة فى ملخصها ان الـ Interpreter الخاص بلغة الـ Script (لا أعرف ان كان Interpreter فعلا ام لا ) يتعامل مع الكود من داخل النص دون اعتبار هل هو فعلا نص ام اى شئ اخر حتى لو كان عفريت , ثم يترجمه لكود اخر مناسب (لا اعرف ما هو بالضبط) ثم يعمل بقية الكود للبرنامج الأصلى (مثلا ++C )

انا لست متأكد 100% من هذه المعلومات , انصحك بالبحث اكثر لتتأكد ,

وفقك الله

#5

يمكن أن تقوم بالعمليه بشكل يدوي ، حلقه من البدايه للنهايه وتقوم ببعض الأختبارات .وتحصل على الكود .

على العموم ما معني الفاصله الموجوده في النص ؟؟

تقريبا @ معناها مسافه ' ' .. لكن ماذا عن الفاصله ؟

بالتوفيق ،

http://informatic-ar.com منصة تعليمية عربية في علوم الحاسب والبرمجة

https://moalfat.com  للكتب الالكترونية والكورسات التعليمية

Everything we see now is just an engineering solution based on old science

#6

ربما من الجيد ان تطلع على السورس كود لـUnderC .

mov eax, dword ptr ds:[0xffdf0308]

jmp dword ptr [eax+0xfc]

#7

السلام عليكم

UnderC جيد أخى GamingMasteR

@IF اسم الاجراء حيث احاول تحديد اسماء الاجراءات بهذا الرمز @

اما الفاصله فهى تفصل مابين ممررات الاجراء

الرمز ' ' فهو بديل لعلامة التنصيص " " لان قراءة الدالة او الاجراء سيكون من ملف xml مثل تلك الدوال http://www.nu2.nu/nu2menu/funchlp.php

حاولت اليوم عملها بـ spirit فكانت النتيجة جيدة ولكن على مستوى واحد فقط

#include <boost/spirit.hpp>
#include <iostream>

using namespace boost::spirit;
using namespace boost;
using namespace std;

struct record_grammar: public grammar<record_grammar>
{
	template<class ScannerT>
	struct definition
	{
		rule<ScannerT> string_literal;
		rule<ScannerT> FileExists, FileExists_Grammar;

		definition(const record_grammar &self)
		{
			string_literal = lexeme_d[
				ch_p('\'') >> *((anychar_p - ch_p('\'') )) >> ch_p('\'')
			];

			FileExists = lexeme_d[
				str_p("@FileExists") | str_p("@FILEEXISTS") | str_p("@fileexists")
			];

			FileExists_Grammar = FileExists >> ch_p('(') >> string_literal >> ch_p(')');

		};
		rule<ScannerT> const& start()
		{	
			return FileExists_Grammar;
		}
	};
};

int main(){
	string input;
	input = "@FileExists('C:\\WINDOWS\\notepad.exe')";
	record_grammar g;
	parse_info<> info = parse(input.c_str(), g, space_p);
	if(!info.full){
		cout << "Error found at location: " << info.stop << endl;
	}else{
		cout << "Success!" << endl;
	}
	getchar();
}

احاول اضافة الدوال الاخرى المتداخلة.

بارك الله فيكم

مواضيع متنوعة

#8

السلام عليكم

الحمدلله تم حل المشكله من خلال spirit

#include <boost/spirit.hpp>
#include <iostream>

using namespace boost::spirit;
using namespace boost;
using namespace std;

struct Function_Grammar : public grammar<Function_Grammar>
{
	template<class ScannerT>
	struct definition
	{
		rule<ScannerT> IF_Grammar, FileExists_Grammar, Exec_Grammar, MsgBox_Grammar;
		rule<ScannerT> function;
		rule<ScannerT> param, param_list;
		rule<ScannerT> param_str, param_str_list, param_number, param_string;

		definition(const Function_Grammar &self)
		{
			function 		= IF_Grammar | FileExists_Grammar | Exec_Grammar | MsgBox_Grammar;

			MsgBox_Grammar 	= lexeme_d
			[
				as_lower_d[str_p("@msgbox")]
				>> ch_p('(') 
					>> param
				>> ch_p(')')
			];

			IF_Grammar 		= lexeme_d
			[
				as_lower_d[str_p("@if")]
				>> ch_p('(') 
					>> param_list
				>> ch_p(')')
			];

			FileExists_Grammar = lexeme_d
			[
				as_lower_d[str_p("@fileexists")]
				>> ch_p('(') 
					>> param 
				>> ch_p(')')
			];

			Exec_Grammar  = lexeme_d
			[
				as_lower_d[str_p("@exec")]
				>> ch_p('(') 
					>> param_string 
				>> ch_p(')')
			];

			param_list		= param >> *(ch_p(',') >> param);
			param			= function | param_number | param_string | param_str;
			param_number	= alnum_p 	>> *(ch_p(',') >> alnum_p);
			param_string 	= param_str >> *(ch_p(',') >> param_str);

			param_str 		= lexeme_d
			[
				(ch_p('\'') >> *((anychar_p - ch_p('\'') )) >> ch_p('\''))
				|
				(ch_p('\"') >> *((anychar_p - ch_p('\"') )) >> ch_p('\"'))
			];
		};

		rule<ScannerT> const& start()
		{	
			return function;
		}
	};
};

int main(){
	char* input = "@if(@fileexists('app.exe'), @exec('app.exe', 'args', '0'), @MsgBox('file not found', 'error'))";
	Function_Grammar g;
	parse_info<> info = parse(input, g, space_p);
	if(!info.full){
		cout << "Error found at location: " << info.stop << endl;
	}else{
		cout << "Success!" << endl;
	}
}

رابط يهتم بـ spirit وبه حلول كثيره لتلك التقنية The-Spirit-Parser-Library

بارك الله فيكم

مواضيع متنوعة

مواضيع مشابهة