كيف يمكنني تحليل التعليمات البرمجية لبناء مترجم في جافا ؟

StackOverflow https://stackoverflow.com/questions/672577

سؤال

أريد أن أكتب مترجم.ومن الواجبات المنزلية في univ.المعلم قال لنا أنه يمكننا استخدام أي API نريد تحليل التعليمات البرمجية ، طالما أنها فكرة جيدة.بهذه الطريقة يمكننا أن نركز أكثر على JVM سوف تولد.

لذا نعم, أنا أكتب مترجم في جافا لتوليد جافا.

هل تعرف أي خير API من أجل هذا ؟ يجب استخدام التعابير المنطقية?أنا عادة أكتب بلدي موزعي من جهة ، على الرغم من أنه ليس من المستحسن في هذا السيناريو.

سيكون موضع تقدير أي مساعدة.

هل كانت مفيدة؟

المحلول

Regex هو جيد للاستخدام في مترجم, ولكن فقط من أجل الاعتراف الرموز (أيلا العودية الهياكل).

الطريقة الكلاسيكية في كتابة المترجم هو وجود المعجمية محلل الاعتراف الرموز ، جملة محلل الاعتراف هيكل ، الدلالي محلل الاعتراف معنى ، المتوسطة مولد رمز, ، محسن, و تستمر الهدف مولد رمز.أي من تلك الخطوات التي يمكن دمجها ، أو تخطي تماما, إذا كان يجعل المترجم أسهل في الكتابة.

كانت هناك العديد من الأدوات المتقدمة للمساعدة في هذه العملية.جافا, يمكنك أن تبحث في

نصائح أخرى

وأوصي ANTLR ، وذلك أساسا من قدرات الجيل انتاجها عبر StringTemplate.

ما هو أفضل هو أن تيرينس بار كتاب على نفسها والتي الآن واحد من أفضل الكتب الموجهة نحو الكتابة المجمعين مع مولد محلل.

وبعد ذلك لديك ANTLRWorks التي تمكنك من دراسة وتصحيح قواعد اللغة الخاصة بك على الطاير.

وعلى رأس كل ذلك، و ANTLR يكي + الوثائق ، (وإن لم يكن شاملا بما فيه الكفاية لتروق لي)، هو مكان جيد لتبدأ لأي مبتدئ. انها ساعدتني تحديث المعرفة حول الكتابة المترجم في الأسبوع.

وإلقاء نظرة على JavaCC أو محلل لغة جافا. فمن السهل جدا للاستخدام، والحصول على تعليق

والذهاب الكلاسيكية - ليكس + ياك. في جاوة ذلك نوبات JAX و <لأ href = "https://javacc.dev.java.net/" يختلط = "نوفولو noreferrer"> javacc . Javacc حتى لديه بعض جافا قواعد النحو على استعداد للتفتيش.

وأنا أنصح باستخدام إما metacompiler مثل ANTLR أو بسيط <لأ href = "HTTP: // EN .wikipedia.org / ويكي / Parser_Combinator "يختلط =" noreferrer "> محلل combinator مكتبة . جافا الوظيفي لها <لأ href = "http://functionaljava.googlecode.com/svn/artifacts/2.19/javadoc/ FJ / محلل / حزمة summary.html "يختلط =" noreferrer "> محلل combinator API . هناك أيضا JParsec . وتقوم كل من هذه على المكتبة بارسيك لهاسكل .

JFlex هو مولد الماسح الضوئي الذي، وفقا لفي دليل ، تم تصميمه للعمل مع مولد محلل <لأ href =" http://www2.cs.tum.edu/projects/cup/ "يختلط = "نوفولو noreferrer"> CUP .

<اقتباس فقرة>   

وكان واحدا من أهداف التصميم الرئيسية JFlex لجعل التواصل مع المجاني مولد محلل جافا CUP سهلا كما ربما [كذا].

وكما أن لديها الدعم للحصول على <لأ href = "HTTP: //byaccj.sourceforge صافي / "يختلط =" نوفولو noreferrer "> BYACC / J ، والتي، كما يوحي اسمها، هو ميناء بيركلي YACC لإنشاء تعليمات برمجية جافا.

ولقد استخدمت JFlex نفسه وأحب ذلك. Howeveer، كان المشروع كنت أفعله بسيطا بما فيه الكفاية أن كتبت محلل باليد، لذلك أنا لا أعرف كيف جيدة سواء CUP أو BYACC / J هو.

ولقد استعملت SableCC في بلدي بالطبع مترجم، ولكن ليس عن طريق الاختيار.

وأتذكر تجد ضخمة جدا والوزن الثقيل، مع مزيد من التركيز على النظافة من الراحة. (لا الأسبقية المشغل أو أي شيء، عليك أن أذكر أن في قواعد اللغة)

وربما كنت ترغب في استخدام شيء آخر إذا كان لي الاختيار. تجربتي مع ياك (لC) وسعيدة (لهاسكل) وكانت كل من لطيف.

وcombinators محلل هو خيار جيد. تنفيذ جافا شعبية هو JParsec.

إذا كنت تريد الذهاب للذهاب المتشددين، ورمي في شيء من http://llvm.org في مزيج:)

وأقترح عليك أن ننظر في المصدر لبيانشيل. كان لديه مترجم للجافا وبسيطة إلى حد ما للقراءة.

http://java-source.net/open-source/parser-generators و http://catalog.compilertools.net/java.html يحتوي على الكتالوجات من الأدوات لذلك. قارن أيضا ستاكوفيرفلوو السؤال إلى التعبير العادية .

استخدم لcombinator محلل، مثل JParsec . هناك href="https://vimeo.com/40323909" فيديو تعليمي جيد على كيفية استخدامها .

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top