سؤال

أساسا أريد أن أجد ، في ملف ، وذلك باستخدام أنتلر ، كل تعبير على النحو المحدد :

كلمة.كلمة

على سبيل المثال :"النهاية.بداية " المباريات

في الوقت الحالي ، يمكن أن يحتوي الملف على مئات ومئات الأسطر وبنية معقدة.

هل هناك طريقة لتخطي كل شيء (حرف?) التي لا تتطابق مع نمط المذكورة أعلاه, دون إجراء قواعد اللغة التي تمثل تماما الملف ?

حتى الآن هذه هي قواعدي لكنني لا أعرف ماذا أفعل بعد ذلك.

 grammar Dep;

program
    : 
       dependencies
    ;

dependencies
    :
      (
       dependency
      )*
    ;

dependency
    :
      identifier
      DOT
      identifier
    ;

identifier
    :
      INDENTIFIER
    ;

DOT     : '.'       ;

INDENTIFIER
  :
    [a-zA-Z_] [a-zA-Z0-9_]*
  ;

OTHER
  :
    . -> skip
  ;
هل كانت مفيدة؟

المحلول

الطريقة التي كنت تفعل ذلك الآن ، و dependency سوف تتطابق القاعدة أيضا مع الرموز المميزة 'end', '.', 'beginning' من المدخلات:

end
#####
.
#####
beginning

لأن الخط يكسر و '#'يتم تخطي المستخدمين من دفق الرمز المميز.

إذا كان هذا هو لا ما تريد ، أي.كنت ترغب في المباراة "end.beginning" بدون أي حرف بينهما ، يجب عليك إنشاء قاعدة ليكسر واحدة منها ، ومطابقة هذه القاعدة في المحلل اللغوي الخاص بك:

grammar Dep;

program
 : DEPENDENCY* EOF
 ;

DEPENDENCY
 : [a-zA-Z_] [a-zA-Z0-9_]* '.' [a-zA-Z_] [a-zA-Z0-9_]*
 ;

OTHER
 : . -> skip
 ;

ثم هل يمكن استخدام شجرة المستمع أن تفعل شيئا مفيدا مع الخاص بك DEPENDENCYفي:

public class Main {

  public static void main(String[] args) throws Exception {

    String input = "### end.beginning ### end ### foo.bar mu foo.x";
    DepLexer lexer = new DepLexer(new ANTLRInputStream(input));
    DepParser parser = new DepParser(new CommonTokenStream(lexer));

    ParseTreeWalker.DEFAULT.walk(new DepBaseListener(){
      @Override
      public void enterProgram(@NotNull DepParser.ProgramContext ctx) {
        for (TerminalNode node : ctx.DEPENDENCY()) {
          System.out.println("node=" + node.getText());
        }
      }
    }, parser.program());
  }
}

التي من شأنها طباعة:

node=end.beginning
node=foo.bar
node=foo.x
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top