محلّل تعبيرات بسيط
أنشئ محلّلًا تنازليًا تكراريًا للتعبيرات الحسابية باستخدام Lua الخالصة
محلّل تعبيرات بسيط درس مجاني في Lua Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Lua Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Lua Academy 4 دروس في المجموع.
الهدف: تحليل التعبيرات الحسابية
ابنِ محللًا نحويًا للنزول التكراري باستخدام Lua الخالصة، لتحليل تعبيرات مثل 3 + 4 * (2 - 1) وتقييمها مع احترام أولوية المعاملات.
المحوّل الرمزي
حوّل أولًا الإدخال إلى رموز تمثل الأرقام والمعاملات والأقواس.
local function tokenize(expr)
local tokens = {}
for tok in expr:gmatch("[%d%.]+|[%+%-%*/%(%)%^]|%S") do
tokens[#tokens+1] = tok
end
return tokens
endمحوّل رموز محسّن
محوّل رموز أكثر متانة باستخدام أنماط gmatch.
local function tokenize(expr)
local tokens = {}
for tok in expr:gmatch("%d+%.?%d*|[%+%-%*/%(%)%^]") do
tokens[#tokens+1] = tok
end
return tokens
endحالة المحلل النحوي
يحتفظ المحلل النحوي بقائمة الرموز وموضعها. وتتقدم الدالتان المساعدتان peek وconsume عبر الرموز.
local function newParser(tokens)
local pos = 1
local function peek() return tokens[pos] end
local function consume() pos = pos + 1; return tokens[pos-1] end
return {peek=peek, consume=consume}
endقواعد التعبيرات
تحترم القواعد أولوية المعاملات:
- expr = term ((+ | -) term)*
- term = factor ((* | /) factor)*
- factor = number | (expr) | -factor
تحليل الحدود
حلّل التعبيرات الجمعية بتحليل الحدود ثم إجراء الطي من اليسار إلى اليمين باستخدام + و-.
local parseExpr, parseTerm, parseFactor
parseExpr = function(p)
local val = parseTerm(p)
while p.peek() == "+" or p.peek() == "-" do
local op = p.consume()
local right = parseTerm(p)
if op == "+" then val = val + right
else val = val - right end
end
return val
endتحليل العوامل
حلّل التعبيرات الضربية، بما في ذلك الرفع إلى الأس.
parseTerm = function(p)
local val = parseFactor(p)
while p.peek() == "*" or p.peek() == "/" do
local op = p.consume()
local right = parseFactor(p)
if op == "*" then val = val * right
else val = val / right end
end
return val
endتحليل الأرقام والأقواس
حلّل العناصر الأساسية: القيم الحرفية، والتعبيرات الفرعية الموضوعة بين أقواس، والنفي الأحادي.
parseFactor = function(p)
local tok = p.peek()
if tok == "(" then
p.consume() -- (
local val = parseExpr(p)
p.consume() -- )
return val
elseif tok == "-" then
p.consume()
return -parseFactor(p)
else
return tonumber(p.consume())
end
endتجميع الأجزاء
حوّل التعبير إلى رموز، وحلّله، ثم قيّمه.
local function eval(expr)
local tokens = tokenize(expr)
local parser = newParser(tokens)
return parseExpr(parser)
end
print(eval("3 + 4 * 2")) -- 11
print(eval("(3 + 4) * 2")) -- 14
print(eval("2 ^ 10")) -- 1024 (if ^ is supported)توسيع المحلل النحوي
أضف المتغيرات والدوال ومعاملات المقارنة والقيم الحرفية النصية من خلال توسيع القواعد وإضافة حالات جديدة إلى parseFactor.
الإبلاغ عن الأخطاء
تتبّع السطر والعمود في محوّل الرموز. وارفع أخطاء ذات معنى: "Expected ')' at position 7, got '+'".
مولدات المحللات النحوية
للقواعد النحوية المعقدة، استخدم مولدات المحللات النحوية مثل LPEG (قواعد تحليل التعبيرات). إن LPEG أقوى بكثير وأكثر تعبيرًا من النزول التكراري المكتوب يدويًا عند التعامل مع القواعد النحوية الكبيرة.
سؤال حول المحلل النحوي
ما الذي يستخدمه محلل النزول التكراري لفرض أولوية المعاملات؟
مراجعة: محلل تعبيرات بسيط
يستخدم محلل النزول التكراري دالة لكل قاعدة نحوية، ويفرض أولوية المعاملات طبيعيًا من خلال تسلسل الاستدعاءات. حوّل الإدخال إلى رموز أولًا، ثم نفّذ دوال expr → term → factor. وسّعه بالمتغيرات والدوال لبناء لغة تعبيرات متكاملة.
الأسئلة الشائعة
هل درس «محلّل تعبيرات بسيط» مجاني؟
نعم — نص درس «محلّل تعبيرات بسيط» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Lua Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Lua Academy 4 دروس في المجموع.
ماذا ستتعلم في «محلّل تعبيرات بسيط»؟
أنشئ محلّلًا تنازليًا تكراريًا للتعبيرات الحسابية باستخدام Lua الخالصة تتمرن على Lua Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Lua Academy؟
لا تُشترط خبرة سابقة. Lua Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.
كم من الوقت يستغرق درس «محلّل تعبيرات بسيط»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Lua Academy هذا؟
نعم. كل درس في Lua Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.