سؤال

ولقد كنت أتساءل لفترة طويلة لماذا لا يبدو أن هناك أي موزعي ل، مثلا، <وأ href = "http://en.wikipedia.org/wiki/Backus٪E2٪80٪93Naur_Form" يختلط = "نوفولو noreferrer"> BNF أو أن تتصرف مثل regexps في مختلف المكتبات.

وبالتأكيد، هناك أشياء مثل ANTLR و <لأ href = "HTTP: //en.wikipedia. غزاله / ويكي / ياك "يختلط =" نوفولو noreferrer "> ياك وغيرها الكثير التي <م> توليد كود والتي، بدورها، يمكن تحليل و<لأ href =" HTTP: // داخلي. wikipedia.org/wiki/Context-free_grammar "يختلط =" نوفولو noreferrer "> CFG ، ولكن هناك لا يبدو أن هناك المكتبة التي تستطيع أن تفعل ذلك دون خطوة وسيطة.

وأنا مهتم في كتابة تهوى تجميع العناصر محلل أو التمهيد كل تلك متداخلة -parenthesis-المراوغات المرتبطة regexps (وربما أكثر من ذلك، لهذه الرياضة من ذلك)، ولكن ما لدي هذا الشعور أنني مجرد المشي في مشكلة وقف آخر تشبه فئة من المستنقعات.

هل هناك / الحد النظري التقني لهذه موزعي، أو أنا مجرد شيء مفقود؟

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

المحلول

وأعتقد أنها أكثر من شيء الثقافي. ويقتصر استخدام قواعد النحو خالية من السياق معظمها إلى المجمعين، والذي عادة ما يكون كود المرتبطة بكل حكم الإنتاج. في بعض اللغات، فإنه من السهل إلى رمز الانتاج من لمحاكاة رد. وفي حالات أخرى، سترى المكتبات محلل: combinators محلل في هاسكل، على سبيل المثال. من ناحية أخرى، والتعبيرات العادية يرى استخدام واسع في أدوات مثل البقرى، حيث انها غير مريح لتشغيل المترجم C في كل مرة المستخدم يعطي تعبير عادي جديد.

نصائح أخرى

Boost.Spirit يشبه ما كنت بعد.

إذا كنت تبحث لجعل الخاصة بك، لقد استعملت <لأ href = "http://www.cs.chalmers.se/Cs/Research/Language-technology/BNFC/" يختلط = "نوفولو noreferrer" > BNFC للحصول على أحدث مشروع مجمع بلدي وأنه يوفر <لأ href = "http://www.cs.chalmers.se/Cs/Research/Language-technology/BNFC/doc/examples/LBNF.cf" يختلط = "noreferrer نوفولو"> قواعد اللغة المستخدمة في تنفيذ تلقاء نفسها . وهذا قد يكون نقطة انطلاق جيدة ...

وليس والتقني / الحد النظري يختبئون في الظل هناك. لا أستطيع أن أقول لماذا لم تكن أكثر شعبية، ولكن أعرف من مكتبة واحدة على الأقل التي توفر هذا النوع من "على خط" الاعراب التي كنت تسعى.

SimpleParse هي مكتبة الثعبان الذي يتيح لك ببساطة لصق الخاص شعر القواعد EBNF إلى البرنامج واستخدامه تحليل الأمور في نصابها الصحيح بعيدا، أي خطوات itermediate. لقد استعملت للعديد من المشاريع حيث كنت أرغب في لغة الإدخال مخصصة ولكن في الحقيقة لا يريد أن يلتزم بأي عملية الإنشاء الرسمية.

وهنا مثال صغير من على قمة رأسي:

decl = r"""
    root := expr
    expr := term, ("|", term)*
    term := factor+
    factor := ("(" expr ")") / [a-z]
"""
parser = Parser(decl) 
success, trees, next = parser.parse("(a(b|def)|c)def")

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

وPyparsing ( http://pyparsing.wikispaces.com ) وقد بنيت في دعم للتحليل تهوى تجميع العناصر و فمن بيثون النقي، حتى تتمكن من رؤية التنفيذ الفعلي.

ولأن الخلط بين قواعد النحو خالية من السياق كاملة بما فيه الكفاية كما هي دون بعض تركيب كثيفة بشكل غامض وغير مفهوم لجعلها اكثر تشوشا؟

ومن الصعب أن تعرف ما كنت طالبا. هل تحاول خلق شيء مثل التعبير العادي، ولكن لقواعد النحو خالية من السياق؟ مثل، وذلك باستخدام $var =~ /expr = expr + expr/ (في بيرل)، وبعد أن "1 + 1" مباراة أو "1 + 1 + 1" أو "1 + 1 + 1 + 1 + 1 + ..."؟ أعتقد أن واحدة من القيود المفروضة على هذا سيكون بناء الجملة: بعد أكثر من ثلاثة قواعد يجري لجعل حياتك "قواعد اللغة في التعبير" حتى أكثر غير قابل للقراءة من أي تعبير منتظم في العصر الحديث

.

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

وطريقة واحدة حول ذلك سيكون لتسمية الإجراءات وثم جعل وظيفة "العمل" الذي يأخذ اسم الإجراء إلى قيام وسائط للقيام بذلك مع.

هل يمكن نظريا أن تفعل ذلك مع تعزيز الروح في C ++، ولكن يتم أساسا لقواعد النحو ثابتة. أعتقد أن السبب في هذا ليس شائعا أن CFGS لا تستخدم عادة باسم regexs. أنا لم أصب لاستخدام قواعد اللغة إلا لبناء المجمع، ولكن لقد استخدمت regexs مرات عديدة. CFGS عادة ما تكون أكثر تعقيدا من regexs، لذلك فمن المنطقي لإنشاء رمز ثابت مع أداة مثل YACC أو ANTLR.

tcllib لديه شيء من هذا القبيل، إذا كان يمكنك طرح مع <أ href ل = "http://en.wikipedia.org/wiki/Parsing_expression_grammar" يختلط = "نوفولو noreferrer"> تحليل التعبير قواعد النحو وأيضا TCL. إذا بيرل هو الشيء الخاص بك CPAN ديه تحليل :: إيرلي . هنا الصورة على بيرل الاختلاف النقي الذي تبدو واعدة. PLY يبدو أن هناك حلا معقولا لبيثون

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