ile başarısız.ANTLR AST kuralları basit bir gramere sahip RewriteEmptyStreamException
assignment
: IDENT ':=' expr ';' -> ^(':=' IDENT expr)
;
expr
: factor ('*' factor)* -> ^('*' factor+)
;
factor
: primary ('+' primary)* -> ^('+' primary+)
;
primary
: NUM
| '(' expr ')' -> ^(expr)
;
Ama çalışmıyor: Ben çevrimiçi ve Dil Kalıpları kitapta okuduğum kadarıyla, böyle dilbilgisi değiştirmek gerekir. Tamamlayıcı olsa da, ayrıştırıcıyı çalıştırdığımda bir RewriteEmptyStreamException hatası alıyorum. İşte işler tuhaflaşıyor.
ADD ve MULT sözdizimi belirteçleri ve bunları ağaç düğümleri yerine kullanacak olursak, hata olmadan çalışır. Ben düğüm eki gösterimini kullanırsanız
tokens { ADD; MULT; }
expr
: factor ('*' factor)* -> ^(MULT factor+)
;
factor
: primary ('+' primary)* -> ^(ADD primary+)
;
Alternatif olarak, aynı zamanda sorunsuz görünen:
expr
: factor ('*'^ factor)*
;
factor
: primary ('+'^ primary)*
;
davranışındaki bu tutarsızlık bir hata mı?
Teşekkürler bir ton @JoelPM. Tam olarak aradığım şey bu. Değerlendirirken derin iç içe ağaç ve yığın taşmaları ile ilgili bir sorun yaşadık.Bu bize bir N-ary ağacı üretme şansı verir ve ağacın derinliğini büyük ölçüde azaltır. –