لدي ملف code.txt يحوي التالي:
int x=2; cout<<"The squre of x is: "<<x*x<<endl;
هل يمكن كتابة برنامج يقرأ محتوى الملف وينفذه؟
لدي ملف code.txt يحوي التالي:
int x=2; cout<<"The squre of x is: "<<x*x<<endl;
هل يمكن كتابة برنامج يقرأ محتوى الملف وينفذه؟
تعال نفكر معا:
انت تريد ان تقرأ الملف وتنفيذة
انت تريد يترجم برنامجك معني الكلمات المحجوزة فى سي++ ويقوم بقرأة الوسائط الممرة اليها وتنفيذ التعليمات طبقا لما هو موجود بالملف النصي.
يمكننا ان نبسط الموضوع وننتقل الى قارئ تعبيرات او مفسر تعبيرات لتسهيل عملية قراءة الملفات النصية.
لكن هل يمكننا محاكاة كل تعليمات سي++ او القليل منها...؟
اننا فى النهاية سوف نخلص الى تصميم وبرمجة مترجم سي++ وليس برنامج عادي.
اﻵن استطيع ان اقول لك ابحث كيفيفة عمل مترجم سي++ بسيط اعتقد ان هذا سوف يوفر عليك الكثيرا من الوقت.
أو كمرحلة اولى استخدام مفسر تعبيرات للسيطرة على تعليمات بسيطة وواضحة
وﻻ تنس زيارة الرابط: expression parser cpp
تم تعديل هذه المشاركة بواسطة محمد عودة في 23 ديسمبر 2012 في 19:19
بارك الله فيك أخي محمد ...
أخي adban ابدأ ببرنامج بسيط ثم طوره ...
مثلاً برنامج يقوم بفهم تعليمات cout للنصوص العادية فقط ...
ثم أضف إليه تعريف متحول واحد فقط ...
ثم عدل الجزء الخاص بcout ليفهم عملية اظهاء المتحول ...
وهكذا ... بين إضافة وتعديل إلى أن تصل إلى ما تريد ...
(كلام فارغ
)
على كل حال بالتوفيق
أظن بالإمكان ذلك ولكن تحتاج الملف التنفيذي لمترجم اللغة
لأنه سبق لي أن استخدمت ملف نصي MosaicEffect.fx بلغة HLSL وهي High Level Shader Language ومررت اسم الملف عبر سطر الأوامر لملف تنفيذي صغير fxc.exe تابع لمكتبة الدايركت إكس فيقوم بترجمته وتحويله إلى ملف باينري MosaicEffect.ps أستخدمه في نفس البرنامج
"$(DXSDK_DIR)Utilities\Bin\x86\fxc.exe" /T ps_2_0 /E main /Fo"$(ProjectDir)ShaderEffects/MosaicEffect/MosaicEffect.ps" "$(ProjectDir)ShaderEffects/MosaicEffect/MosaicEffect.fx"
وأظن ربما ينطبق نفس الأمر على أي لغة أخرى مترجمها يقبل سطر الأوامر
وبعد الترجمة فالتنفيذ سهل .
تم تعديل هذه المشاركة بواسطة أبو أحمد المبرمج في 24 ديسمبر 2012 في 07:40
ما أقبـح المعصية ، تذهب لذتها ويبقى إثمها ... ومأ أحسن الطاعة ، تذهب مشقتها ويبقى ثوابها
كل نعيم دون الجنة غرور ... وكـل شقـاء دون النـار سرور
مارايك ان يكون الملف يحتوي الاوامر السابقة بلغة الالة وليس c++ ثم يقوم البرنامج بتحميل الملف الى الذاكرة وإعتباره كدالة ليتم إستدعائها
اما إذا كنت تريد ان يكون الملف بc++ فعليك ان تبحث عن مترجم يقوم بتحويله الى لغة الالة وتشغيله على شكل دالة كما في الخطوة السابقة
حاولت ان افعل ذلك وواجهة بعض المشاكل عندما يكون هناك استدعاء دالة داخل الملف
اقتباسأظن بالإمكان ذلك ولكن تحتاج الملف التنفيذي لمترجم اللغة
نعم هذه الفكرة جميلة ..جربتها من قبل ...
ابحث داخل مجلد الIDEالذي تستخدمه واعثر على المترجم ... ( اسمه cl.exe في visiual studio 6 ) ... وثم بحقظ مسار المترجم ...
ثم استدعه بالتعليمة التالية
system("المسار\\cl.exe yourfile.txt");الدالة system موجوده في المكتبة cstdlib أو stdlib.h ...
بالتوفيق
يمكنك إستخدام أحد أدوات بناء المصرفات (compilers)، أشهرهما Lex & YACC و Flex & Bison، أداتين لكل مجموعة flex و lex وظيفتهما التحليل النحوي و yacc و bison وظيفتهما المعالجة. lex & yacc قديمة وflex & bison الأحدث.
أكوادهما خليط من C وأكواد خاصة بكل أداة تُحول لأكواد C أكثر تعقيد. تحميل flex و bison.
المثال الذي وضعته معالجتة ستأخذ وقت، لنأخذ مثال أبسط بدون متغيرات (كنت أشتغل على المفسر من الساعة 11 والآن الساعة 5:30، ولم أكتشف الا في الأخير أنه يطبع بالمقلوب xD ):
cout << endl << "========================="; cout << endl << "-----> Hello world! <----"; cout << endl << 10 + 45 << "Resualt : "; cout << endl << 5 * 2 / 10 << "Resualt : "; cout << endl << 1 + 10 << "Resualt : "; cout << endl << "D" << "C" << "A"; cout << endl << 1 + 3 + 100 + 220 << " = " << "1 + 3 + 100 + 220"; cout << endl << "=========================";
ملف example.l (المحلل الخاص بـflex):
%{
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "example.tab.h"
#ifdef __cplusplus
extern "C" int yylex(void);
#endif
%}
%option noyywrap
%option yylineno
%%
[ \n\r] ;
";" { return STATEMENT_END; }
"+" { return OPR_ADD; }
"-" { return OPR_SUB; }
"*" { return OPR_MUL; }
"/" { return OPR_DIV; }
"<<" { return COUT_ARG; }
"cout" { return COUT; }
"endl" { return COUT_ENDL; }
[0-9]+ { yylval.integer = atoi(yytext) ; return INTEGER; }
\"([^\\\"]|\\.)*\" { *yytext++ ; yytext[strlen(yytext)-1] = '\0' ; yylval.string = strdup(yytext); return STRING; }
. { printf("Error (flex): syntax error '%s' at line %d.\n", yytext, yylineno); exit(-1); }
%%ملف المعالجة والقواعد الخاص بـbison:
%{
#include <stdio.h>
#include <stdlib.h>
extern FILE *yyin;
extern int yylineno;
void yyerror(char *e) {
printf("Error (bison): grummer error at line %d", yylineno);
exit(-1);
}
#ifdef __cplusplus
extern "C" int yylex(void);
#endif
%}
%union {
char *string;
int integer;
}
%start begin
%token STATEMENT_END
%token<opr> OPR_ADD
%token<opr> OPR_SUB
%token<opr> OPR_MUL
%token<opr> OPR_DIV
%token COUT_ARG
%token COUT
%token COUT_ENDL
%token<integer> INTEGER
%token<string> STRING
%type<integer> expression
%%
begin:
statement;
statement:
cout statement
|
;
cout:
COUT argument STATEMENT_END;
argument:
COUT_ARG STRING { printf("%s", $2); }
| COUT_ARG expression { printf("%d", $2); }
| COUT_ARG COUT_ENDL { printf("\n"); }
| COUT_ARG STRING argument { printf("%s", $2); }
| COUT_ARG expression argument { printf("%d", $2); }
| COUT_ARG COUT_ENDL argument { printf("\n"); }
;
expression:
INTEGER { $ = $1; }
| expression OPR_ADD expression { $ = $1 + $3; }
| expression OPR_SUB expression { $ = $1 - $3; }
| expression OPR_MUL expression { $ = $1 * $3; }
| expression OPR_DIV expression { $ = $1 / $3; }
;
%%
int main(int argc, char **argv)
{
FILE *fh;
if( argc < 2 ) {
printf("usage: %s [file path]", argv[0]);
return -1;
}
if( (fh = fopen(argv[1], "r")) == NULL ) {
perror("Error");
return -1;
}
yyin = fh;
yyparse();
return 0;
}بناء البرنامج، make.bat:
@echo off flex example.l bison -d example.y -o example.tab.h bison example.y gcc lex.yy.c example.tab.c -o interpreter
البناء والتجربة على الملف example.txt:
> makeexample.y: conflicts: 16 shift/reduce example.y: warning: conflicting outputs to file `example.tab.h' example.y: conflicts: 16 shift/reduce > interpreter.exe example.txt 4The squre of x is: ========================= -----> Hello world! <---- Resualt : 55 Resualt : 0 Resualt : 11 ACD 1 + 3 + 100 + 220 = 324 ========================= >
المشروع مرفق، أعتذر عن عدم التفيص الموضوع يأخذ وقت ولازلت مبتدئ مع الأداتين (هذا أول تطبيق). لكن من يريد المزيد فهناك كتاب flex & bison.
بالتوفيق
تم تعديل هذه المشاركة بواسطة Mr.B في 26 ديسمبر 2012 في 05:07
المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية
جارٍ التحقق من المتواجدين…