سؤال

http://www.cs.chalmers.se/Cs / بحوث / لغة التكنولوجيا / BNFC /

وكيف ينبغي أن يكتب لي وصفت BNF للحصول على BNFC لتوليد محلل INI بالنسبة لي؟

ولقد حصلت فقط حتى الآن o__O!

entrypoints File ;

comment "#" ;

token ID ( letter | digit | ["-_'"] )+ ;

Ini. File ::= [Section] ;
Sect. Section ::= "[" ID "]" [Statement] ;
Bind. Statement ::= ID "=" ID ;

separator Statement "\n" ;
terminator Section "" ;

[name]
#x = 10
y = 20

Parse Successful!

[Abstract Syntax]

Ini [Sect (ID "name") [Bind (ID "y") (ID "20")]]

[Linearized tree]

[name]y = 20

[name]
x = 10
#y = 20

Parse Successful!

[Abstract Syntax]

Ini [Sect (ID "name") [Bind (ID "x") (ID "10")]]

[Linearized tree]

[name]x = 10

وo__O أنا عالقة ...

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

المحلول

وسألت واحدا من المشروعات الإنمائية BNFC وأقتبس رده هنا:

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

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


ومثل على سبيل المثال:

entrypoints File ;

comment "#" ;

token ID ( letter | digit | ["-_'"] )+ ;

Ini. File ::= [Section] ;
Sect. Section ::= "[" ID "]" [Statement] ;
Bind. Statement ::= ID "=" ID ;

separator Statement "//" ;
terminator Section "//" ;

واقرأ:

[name]
x = 10
y = 20

والمعالجة المسبقة:

[name]//
x = 10//
y = 20//

وتحليل:

Ini [Sect (ID "name") [Bind (ID "x") (ID "10"), Bind (ID "y") (ID "20")]]

وتحويل:

                                          ↓                       ↓
Ini [Sect (ID "name") [Bind (ID "x") (ID "0"), Bind (ID "y") (ID "0")]]

والكتابة:

[name]//
x = 0//
y = 0//

والمعالجة اللاحقة:

[name]
x = 0
y = 0

و(غير محددة، لا أعرف ما اذا كان يعمل، فقط لإعطاء فكرة !!)

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