antlr و dsl تحليل الدمى: التعامل مع بيضاء

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

  •  05-09-2019
  •  | 
  •  

سؤال

أحاول تطوير DSL مصغرة لتكوين البرامج، باستخدام Antlworks للنماذج الأولية. سيكون مصدر نموذجي:

name: myname;
value: myvalue;
flag debug {
   value = debugvalue;
}
if flag(debug) {
   libname = foo_d;
} else {
   libname = foo;
}

الآن، لم أحصل أبدا على دورة رسمية حول التحليل، لذلك أقوم بكل هذا عن طريق التجربة / الخطأ من Antlworks وبعض الأساسيات على قواعد النحوية BNF. مشكلة واحدة ثابتة واجهت مسافة بيضاء ومناولة نيولينية. أعرف شيئا مثل

program:    statement* EOF;

statement: compound_statement | selection_statement | field_statement;
selection_statement:    'if' expr statement;
statement_list: (WS* statement)+;
compound_statement: '{' statement_list? '}';
field_statement: name_statement | value_statement;
name_statement: 'name' WS* ':' WS* WORD WS* ';';
value_statement: 'value' WS* ':' WS* WORD WS* ';';

// Tokens
WS  :   (' ' | '\t' | '\n');
WORD:   ('a'..'z'|'A'..'Z')('a'..'z'|'A'..'Z'|'0'..'9'|'_')*;

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

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

المحلول

عادة، سوف تفعل هذا عن طريق إضافة

{ $channel=HIDDEN; }

العمل إلى WS القاعدة؛ يرى هذه الصفحة، القسم قواعد Lexer للتفاصيل.

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