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

مطلوب قرامر بايثون بسيط

بدأه مبرمجة العالم في 8 يونيو 2010 · 7 رد · 1,296 مشاهدة · في لغة Python
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

عندي مشروع عشان ابداه لازم يكون عندي قرامر بايثون بسيط ولازم يكون BNF

بحثت بالانترنت لكن لم اجد الا EBNF

اريد قرامر يغطي فقط على سبيل المثال while,if , normal variable not complicated

يكون بسيط ,,,رجاء مساعده منكم ياخبراء البايثون

لاي ياخ طارق بالفعل أجل !!

ةوانت ياخ sdn

ساعدني بما انو سهل عندك ,,,,

هذا القرامر اللي اخترته وحاولت اعدله ,,ومثل ماذكرت انا ابيه bnf ,,,,,, هل تحويلي صح ام خطأ ؟؟؟؟؟ اذا خطأ فاليت تصححه لي

هاذي هي قرامر EBNF

identifier ::= (letter|"_") (letter | digit | "_")*

letter ::= lowercase | uppercase

lowercase ::= "a"..."z"

uppercase ::= "A"..."Z"

digit ::= "0"..."9
compound_stmt ::= if_stmt
                | while_stmt

for_stmt ::= 
             "for" target_list "in" expression_list
              ":" suite
                ["else" ":" suite]


while_stmt ::= "while" expression ":" suite ["else" ":" suite]

suite ::= stmt_list NEWLINE

stmt_list ::=  simple_stmt (";" simple_stmt)* [";"]

simple_stmt ::= expression_stmt

expression_stmt ::=  expression_list

expression_list ::= expression ( "," expression )* [","]

expression ::= conditional_expression 

conditional_expression ::= or_test ["if" or_test "else" expression]

or_test ::= and_test | or_test "or" and_test

and_test ::= not_test | and_test "and" not_test

not_test ::= comparison | "not" not_test

comparison ::= or_expr ( comp_operator or_expr )*

comp_operator ::= "<" | ">" | "==" | ">=" | "<=" | "<>" | "!="
                | "is" ["not"] | ["not"] "in"

or_expr ::= xor_expr | or_expr "|" xor_expr

xor_expr ::= and_expr | xor_expr "^" and_expr

and_expr ::= "&" | and_expr

وتحويلي لـ BNF هـــو:

identifier ::=letterletter| letterdigit| letter"_"| "_"letter | "_"digit | "_""_"

letter ::= lowercase | uppercase

lowercase ::= "a"..."z"

uppercase ::= "A"..."Z"

digit ::= "0"..."9

compound_stmt ::= if_stmt
                | while_stmt

if_stmt ::= "if" expression ":" suite"elif" expression ":" suite 
if_stmt|"else" ":" suite

while_stmt ::= "while" expression ":" suite "else" ":" suite
|"while" expression ":" suite

suite ::= stmt_list NEWLINE

stmt_list ::=  simple_stmt ";" simple_stmt stmt_list|";"

simple_stmt ::= expression_stmt

expression_stmt ::=  expression_list

expression_list ::=   expression  "," expression expression_list| ","

expression ::= conditional_expression 

conditional_expression ::= or_test "if" or_test "else" expression
|or_test

or_test ::= and_test | or_test "or" and_test

and_test ::= not_test | and_test "and" not_test

not_test ::= comparison | "not" not_test

comparison ::= or_expr  comp_operator or_expr 

comp_operator ::= "<" | ">" | "==" | ">=" | "<=" | "<>" | "!="
                | "is" ["not"] | ["not"] "in"

or_expr ::= xor_expr | or_expr "|" xor_expr

xor_expr ::= and_expr | xor_expr "^" and_expr

and_expr ::= "&" | and_expr
#3

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

هل حاولتى بالفعل فى تحديد ال Formal Definition و ال Rules الخاصة بال Variables ,IF and While Statements

تم تعديل هذه المشاركة بواسطة طارق إبراهيم في 9 يونيو 2010 في 11:42

Technical Lead Developer

My LinkedIn Profile

اللهم قنى شر الجهل و الجهلاء

( اقْتَرَبَ لِلنَّاسِ حِسَابُهُمْ وَهُمْ فِي غَفْلَةٍ مَّعْرِضُونَ ) {الأنبياء:1}

#4

هناك الكثير والكثير جدا ,, ومن دون بحث ما العيب فى ال EBNF ,, حوله مباشره الى BNF لا مشكله فى هذا ابدا

#5

السؤال غير واضح .. هل تريد الكرامر الخاص بلغة بايثون نفسها ام ماذا؟

#8
اقتباس
الله انتو نايمين صدق

لو كتبته بقسم الكومبايلر اصرف

بالفعل واضح مين النايم!

اتبعي الثلاث خطوات التالية, للتحويل. و لنفترض أن:

"lambda" is the empty string
Capital Letters are  are NON-TERMINALS
Small letters are terminals

الخطوات:

1)
A := a|b// A is either 'a' or 'b'
------------------------------------
A := a
A := b

2)
A := ac // B is optional
---------------------------
A := aNc
N := lambda
N := B

3)
A := a{B}*c // zero or more repetions of B
-------------------------------------------
A := aNc
N := lambda
N := BN

هل هذا كاف؟ أعتقد أن هذا أكثر من كاف لحل مسألتك!

عموماً, مثال من القواعد التي أتيت بها,

1)
letter ::= lowercase | uppercase
--------------------------------
letter ::= lowercase
letter ::= uppercase

The following example, comibnes both rules (2) & (3):
// Note that '('...')*' is used instead of '{'...'}*' in this grammar
expression_list ::= expression ( "," expression )* [","]
--------------------------------------------------------
expression_list ::= expression B C
B ::= lambda
B ::= "," expression B
C ::= lambda
C ::= ","

بمجرد أن تتقني الطريقة, سيصبح بإمكانك كتابة Grammar افضل من ناحية الـ Structure, و لكن مكافئ للـ Grammar الذي قمنا بتحويله عن طريق الخطوات. و لكن هذه نتركها للزمن.

بالتوفيق.

تم تعديل هذه المشاركة بواسطة Khaled.Alshaya في 18 يونيو 2010 في 19:20

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