ANTLRv4'teki herhangi bir metin nasıl eşleştirilir? Dilbilgisi yazımı sırasında bilinmeyen metin demek istedim?ANTLR ile keyfi metin (hem sembol hem de boşluk) eşleştirme?
grammar Anytext;
line :
comment;
comment : '#' anytext;
anytext: ANY*;
WS : [ \t\r\n]+;
ANY : .;
Ve kod aşağıda sunulmuştur: My dilbilgisi olan
aşağıdaki
String line = "# This_is_a_comment";
ANTLRInputStream input = new ANTLRInputStream(line);
AnytextLexer lexer = new AnytextLexer(input);
CommonTokenStream tokens = new CommonTokenStream(lexer);
AnytextParser parser = new AnytextParser(tokens);
ParseTree tree = parser.comment();
System.out.println(tree.toStringTree(parser)); // print LISP-style tree
Çıktı aşağıdaki gibidir:
line 1:1 extraneous input ' ' expecting {<EOF>, ANY}
(comment # (anytext T h i s _ i s _ a _ c o m m e n t))
Şunu değiştirirsem ANY
kural
ANY : [ \t\r\n.];
herhangi bir sembolü tanımayı durdurur.
UPDATE1
Sonunda sonu hat karaktere sahiptir.
GÜNCELLEME 2
Yani, bundan lexer birden sınıfları izin veremez çünkü lexer ile herhangi bir metin maç için imkansız olduğunu, anladım. Herhangi bir sembol için lexer kuralını tanımlarsam, diğer tüm kuralları gizler veya çalışmaz.
Ancak soru devam ediyor.
Tüm semboller ayrıştırıcı düzeyinde nasıl eşleştirilir?
Masa biçiminde verilerim olduğunu varsayalım ve bazı alanları işlemek ve başkalarını yok saymam. Ben anytext
kuralı olsaydı, 2 sütun field1
ve field2
değerlerini içeriyorsa
infoline :
(codepoint WS 'field1' WS field1Value) |
(codepoint WS 'field2' WS field2Value) |
(codepoint WS anytext);
burada ayrıştırma am satırları yazmak ve aksi satırları görmezden.
Bu yaklaşım nasıl gerçekleştirilir? hat yorumlar için
Yazınızı, ANTLR 4 sözdiziminde tam olarak aynı kuralı vermek üzere düzenledim. Ayrı bir notta, '' r 'dahil olmak üzere * değil * öneririm? '\ n' satırı terminatörü 'LINE_COMMENT' kuralının bir parçası olarak (karakterleri tükenene kadar değil, satır sonu dahil etmeyecek şekilde). Bunu önerdiğim birkaç neden var, ancak en büyük olanı, 'LINE_COMMENT' biçiminde, bir satırın son satırındaki bir yorumla eşleşmiyorsa açık bir satır sonlandırıcısı tarafından takip edilmemesi. –
evet, ANTLR 3'teydi, düzenlemeler için teşekkürler – hoaz
Neden bu kadar karmaşık? Daha basit yazmak mümkün mü? Kuralım neden çalışmıyor? –