السلام عليكــم ورحمـة الله وبركاتــة
لدى تسلسل هرمى من الاجراءات والدوال داخل نص ممثله على النحو التالى
char* func = "@if(@FileExists('app.exe'), @exec('app.exe', 'args', 0), @MsgBox('error'))";كيف يمكن تحليل هذه التسلسل وتحويله الى كود فعلى؟
السلام عليكــم ورحمـة الله وبركاتــة
لدى تسلسل هرمى من الاجراءات والدوال داخل نص ممثله على النحو التالى
char* func = "@if(@FileExists('app.exe'), @exec('app.exe', 'args', 0), @MsgBox('error'))";كيف يمكن تحليل هذه التسلسل وتحويله الى كود فعلى؟
اخى مودى , على حسب ما فهمت أنك تريد عمل Parsing لـ نص موجود فى String , لتحويله الى كود
فى هذا المشروع : مشروع رسم المعادلات الرياضية , قابلتنا هذه المشكلة و هى اننا نريد ان نحول نص الى دوال رياضية فوجدنا الحل فى استعمال أحد لغات الـ Scripting , و قررنا استخدام لغة ECMAScript و الحمد لله نفذت المطلوب منها على وجه الدقة .
وفقك الله
تم تعديل هذه المشاركة بواسطة Omar Eladel في 3 نوفمبر 2008 في 14:11
اخى مودى ,, ممكن تطلع على الصنف Parser فى رابط المشروع : هنا
و لكن انصحك اولا ان تبدأ فى القراءة عن لغة الـ Script اولا ثم تبدأ فى قراءة الكود
الفكرة فى ملخصها ان الـ Interpreter الخاص بلغة الـ Script (لا أعرف ان كان Interpreter فعلا ام لا ) يتعامل مع الكود من داخل النص دون اعتبار هل هو فعلا نص ام اى شئ اخر حتى لو كان عفريت , ثم يترجمه لكود اخر مناسب (لا اعرف ما هو بالضبط) ثم يعمل بقية الكود للبرنامج الأصلى (مثلا ++C )
انا لست متأكد 100% من هذه المعلومات , انصحك بالبحث اكثر لتتأكد ,
وفقك الله
يمكن أن تقوم بالعمليه بشكل يدوي ، حلقه من البدايه للنهايه وتقوم ببعض الأختبارات .وتحصل على الكود .
على العموم ما معني الفاصله الموجوده في النص ؟؟
تقريبا @ معناها مسافه ' ' .. لكن ماذا عن الفاصله ؟
بالتوفيق ،
http://informatic-ar.com منصة تعليمية عربية في علوم الحاسب والبرمجة
https://moalfat.com للكتب الالكترونية والكورسات التعليمية
Everything we see now is just an engineering solution based on old science
السلام عليكم
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();
}احاول اضافة الدوال الاخرى المتداخلة.
بارك الله فيكم
السلام عليكم
الحمدلله تم حل المشكله من خلال 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
بارك الله فيكم