ترجمة كود C# إلى AST؟
-
03-07-2019 - |
سؤال
هل من الممكن حاليًا ترجمة كود C# إلى شجرة بناء الجملة المجردة؟
يحرر:بعض التوضيح؛لا أتوقع بالضرورة أن يقوم المترجم بإنشاء AST بالنسبة لي - سيكون المحلل جيدًا على ما يرام ، على الرغم من أنني أرغب في استخدام شيء "رسمي". للأسف ، لن تكون تعبيرات Lambda كافية نظرًا لأنها لا تسمح لي باستخدام أجساد البيان ، وهو ما أبحث عنه.
المحلول
مشروع روزلين هو في Visual Studio 2010 ويتيح لك الوصول البرمجي إلى < وأ href = "http://msdn.microsoft.com/en-us/hh543916" يختلط = "noreferrer"> بناء الجملة شجرة ، من بين أمور أخرى.
SyntaxTree tree = SyntaxTree.ParseCompilationUnit(
@" C# code here ");
var root = (CompilationUnitSyntax)tree.Root;
نصائح أخرى
هل من الممكن حاليا لترجمة C # رمز إلى بناء الجملة شجرة مجردة؟
اقتباس فقرة>نعم، مسلي في ظروف خاصة (= باستخدام التعبير إطار و>):
// Requires 'using System.Linq.Expressions;'
Expression<Func<int, int>> f = x => x * 2;
وهذا يخلق شجرة التعبير لامدا، أي وظيفة أخذ int
ويعود ضعف. يمكنك تعديل شجرة التعبير باستخدام إطار التعبير (= الطبقات من في ذلك مساحة الاسم) ومن ثم ترجمة ذلك في وقت التشغيل:
var newBody = Expression.Add(f.Body, Expression.Constant(1));
f = Expression.Lambda<Func<int, int>>(newBody, f.Parameters);
var compiled = f.Compile();
Console.WriteLine(compiled(5)); // Result: 11
لاحظ أن كل التعابير هي ثابتة لذلك يتوجب عليهم أن يبنى من جديد من خلال التركيبة. في هذه الحالة، لقد إرفاق مسبقا إضافة 1.
لاحظ أن هذه الأشجار التعبير تعمل فقط على التعبيرات الحقيقية أي محتوى وجدت في C # وظيفة. لا يمكنك الحصول على أشجار بناء الجملة من أجل ثوابت أعلى مثل الطبقات بهذه الطريقة. استخدام إطار CodeDom لهذه.
تحقق من. NET CodeDom الدعم. هناك مقال القديمة على مشروع قانون ل C # CodeDOM محلل ، لكنه فاز 'ر دعم ميزات لغة جديدة.
وهناك ومن المفترض أيضا أن يكون الدعم في #develop لتوليد شجرة CodeDom من C # شفرة المصدر وفقا لهذا <وأ href = "http://geekswithblogs.net/willemf/archive/2006/07/24/86075. ASPX "يختلط =" noreferrer "> نشر .
هناك أقوى بكثير من مشروع R#.نيميرل. بيج:
https://code.google.com/p/nemerle/source/browse/nemerle/trunk/snippets/peg-parser/
ويحتوي على C# Parser الذي يقوم بتحليل جميع أكواد C# وترجمتها إلى AST!
https://code.google.com/p/nemerle/source/browse/nemerle/trunk/snippets/csharp-parser/
يمكنك تنزيل المثبت هنا: https://code.google.com/p/nemerle/
وشخصيا، أود أن استخدام NRefactory ، وهو خال ومفتوحة المصدر ومكاسب شعبية.
ويبدو أن هذا النوع من الوظائف سيتم تضمين مع كل ما يأتي بعد C # 4، وفقا ل أندرس Hejlsberg في "مستقبل C #" PDC فيديو .
ANTLR محلل مولد ديه النحوي لC # 3.0 الذي يغطي كل شيء باستثناء تركيب LINQ.
ولقد أجاب فقط على موضوع آخر هنا في ستاكوفيرفلوو حل أين أنا نفذت API ل إنشاء ومعالجتها AST من C # رمز المصدر
ومن الغريب أن لا أحد اقترح القرصنة مونو C # مترجم القائمة.
C # أمام إنهاء لDMS بتوزيع كامل C # 3.0 بما في ذلك LINQ و تنتج ASTS. DMS في الواقع هو نظام بيئي لتحليل / تحويل الشفرة المصدرية باستخدام ASTS لالأمامية المقدمة إلى اللغات.
وتحرير 2010/03/10: ... الآن يعالج الكامل C # 4.0
وتحرير: 2014/06/27: مقابض C # 5.0 منذ لحظة تماما
وتحرير: 2016/06/15: مقابض C # 6.0. انظر https://stackoverflow.com/a/37847714/120163 لAST العينة.
وANTLR ليست مفيدة للغاية. LINQ ليس ما تريد.
وحاول Mono.Cecil! http://www.mono-project.com/Cecil
ويتم استخدامه في العديد من المشاريع، بما في ذلك NDepend! http://www.ndepend.com/
ويرجى الاطلاع على R # مشروع (آسف المستندات باللغتين الروسية، ولكن هناك بعض أمثلة التعليمات البرمجية). وهو يتيح التلاعب AST على C # رمز.
http://www.rsdn.ru/projects/rsharp/article /rsharp_mag.xml
SVNوالمشروع هو هنا : (URL تحديثها، وذلك بفضل، <وأ href = " https://stackoverflow.com/users/12045/derigel">derigel )
وكما يرجى الاطلاع على Nemerle اللغة. إنها لغة صافي بدعم قوي لmetaprogramming.