سؤال

أحاول تحليل ملف بيانات في Antlr - ولديها بيضاء اختيارية مثالية

 3 6
  97   12
 15 18

والعروض التالية حيث يبدأ الخط وينتهي. هناك جديد في النهاية ولا توجد علامات تبويب.

^ 3 6$
^  97   12$
^ 15 18$
^

قوتي هي:

lines   :   line+;
line    :   ws1 {System.out.println("WSOPT :"+$ws1.text+":");} 
                num1 {System.out.println("NUM1 "+$num1.text);} 
                ws2 {System.out.println("WS :"+$ws2.text+":");}
                num2 {System.out.println("NUM2 "+$num2.text);} 
                NEWLINE
    ;
num1    :    INT    ;
num2    :    INT    ;
ws1 :   WSOPT;
ws2 :   WS;

INT     : '0'..'9'+;
NEWLINE :    '\r'? '\n';
//WS    :   (' '|'\t' )+ ;
WS  :   (' ')+ ;
WSOPT   :   (' ')* ;

الذي يعطي

line 1:0 mismatched input ' ' expecting WSOPT
WSOPT :null:
NUM1 3
WS : :
NUM2 6
line 2:0 mismatched input '   ' expecting WSOPT
WSOPT :null:
NUM1 97
WS :   :
NUM2 12
BUILD SUCCESSFUL (total time: 1 second)

(أي لم يتم التعرف على WS الرائدة وقد تم تفويت السطر الأخير).

أرغب في تحليل الخطوط التي تبدأ بدون مسافة بيضاء، مثل:

^12    34$
^ 23 97$

ولكن ثم أحصل على أخطاء مثل:

line 1:0 required (...)+ loop did not match anything at input ' '

كنت أقدر التفسيرات العامة لتحليل WS في Antlr.

تعديل @ Jitter لديه إجابة مفيدة - {ignore=WS} لا يظهر في كتاب "مرجع مضاد" النهائي "الذي أعمل منه، من الواضح أنه من الواضح أن منطقة صعبة.

مساعدة لا تزال هناك حاجةلقد قمت بتعديل هذا ل:

lines   :   line line line;
line
options { ignore=WS; }
        :
                ws1  {System.out.println("WSOPT :"+$ws1.text+":");} 
                num1 {System.out.println("NUM1 "+$num1.text);} 
                ws2  {System.out.println("WS :"+$ws2.text+":");}
                num2 {System.out.println("NUM2 "+$num2.text);} 
                NEWLINE
    ;

ولكن الحصول على الخطأ:

illegal option ignore

تعديل يبدو أنه تمت إزالة هذا من V3:http://www.antlr.org/pipermail/antlr-interest/2007-face/019423.html.

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

المحلول 3

لقد تمكنت من الحصول على هذا العمل باستخدام بنيات Lexer مثل:

WS  :   (' ')+ {skip();};

WSOPT   :       (' ')* {skip();};

ولكن ليس في نيولين. ثم في بنيات المحلل المحلل مثل:

num1 num2 NEWLINE;

كان المفتاح هو تجريد جميع WS في Lexer باستثناء الخط الجديد.

نصائح أخرى

WS : (' ' | '\t')+
     {$channel = HIDDEN;}
   ;

يفحص التحليل المعجمي مع Antlr ثم ابحث في الجزء الذي يبدأ بهذا العنوان

تجاهل Whitespace في Lexer

تحتاج إلى استخدام { ignore=WS; } القاعدة

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