كيف يمكنني إدارة Whitespace اختياري في Antlr؟
-
11-09-2019 - |
سؤال
أحاول تحليل ملف بيانات في 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; }
القاعدة