سؤال
أساسا أريد أن أجد ، في ملف ، وذلك باستخدام أنتلر ، كل تعبير على النحو المحدد :
كلمة.كلمة
على سبيل المثال :"النهاية.بداية " المباريات
في الوقت الحالي ، يمكن أن يحتوي الملف على مئات ومئات الأسطر وبنية معقدة.
هل هناك طريقة لتخطي كل شيء (حرف?) التي لا تتطابق مع نمط المذكورة أعلاه, دون إجراء قواعد اللغة التي تمثل تماما الملف ?
حتى الآن هذه هي قواعدي لكنني لا أعرف ماذا أفعل بعد ذلك.
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