Hesap makinesi için kullanıcı tarafından verilen girdiyi bölmeye çalışıyorum. Örneğin, kullanıcı "23 + 45 * (1 + 1)" girdiyse "Bunu [23, +, 45, *, (, 1, +, 1,)] olarak bölmek istiyorum.Hesap makinesi için bölme giriş dizesi
cevap
Aramanız için lexer adı verilir. Bir lexer girişi, okuyabileceğiniz parçalara (jetonları olarak adlandırılır) ayırır.
Neyse ki, yazıcınız oldukça basit ve elle yazılabilir. Daha karmaşık sözcükler için, flex
(Adobe Flex değil "Hızlı Lexical Analyzer'da olduğu gibi) veya (Java kullandığınız için) ANTLR (not, ANTLR, yalnızca bir lexer'dan çok daha fazlasıdır).
Her bir belirteci eşleştirmek için normal ifadelerin bir listesi ile gelmeniz yeterlidir (girişiniz çok basit olduğundan, muhtemelen bu listeden çıkıp hepsini tek bir regexte birleştirebileceğinize dikkat edin. Daha gelişmiş sözcükler, her bir simge için bir düzenli ifadenin yapılmasına yardımcı olur. ayrıştırılmasına daha fazla karakter varken, düzenli ifadelerin her geçmesi ve dizenin başından karşı onları eşleştirmeye çalışır:
\d+
\+
-
*
/
\(
\)
Sonra bir döngü başlar. Eşleşirse, ilk eşleşen grubu giriş listenize ekleyin. Aksi halde, eşlemeye devam et (bunlardan hiçbiri eşleşmezse, kullanıcıya sözdizimi hatası verdiğini söyleyin).
yalancı kod:
List<String>input = new LinkedList<String>();
while(userInputString.length()>0){
for (final Pattern p : myRegexes){
final Matcher m = p.matcher(userInputString);
if(m.find()) {
input.add(m.group());
//Remove the token we found from the user's input string so that we
//can match the rest of the string against our regular expressions.
userInputString=userInputString.substring(m.group().length());
break;
}
}
}
Uygulama notlar:
- Sen normal ifadelerin tümüne
^
karakteri prepend isteyebilirsiniz. Bu, maçlarınızı dizinin başlangıcına sabitlemenizi sağlar. Psödo kodum bunu yaptığınızı varsayar.
Bu biraz eğimli olabilir, çünkü hala öğreniyorum, ancak bunları dizelere bölüyor.
genel sınıf DenemeSınıfı {
public static void main(String[] args)
{
Scanner sc = new Scanner(System.in);
ArrayList<String> separatedInput = new ArrayList<String>();
String input = "";
System.out.print("Values: ");
input = sc.next();
if (input.length() != 0)
{
boolean numberValue = true;
String numbers = "";
for (int i = 0; i < input.length(); i++)
{
char ch = input.charAt(i);
String value = input.substring(i, i+1);
if (Character.isDigit(ch))
{ numberValue = true; numbers = numbers + value; }
if (!numberValue)
{ separatedInput.add(numbers); separatedInput.add(value); numbers = ""; }
numberValue = false;
if (i == input.length() - 1)
{
if (Character.isDigit(ch))
{ separatedInput.add(numbers); }
}
}
}
System.out.println(separatedInput);
}
}
I işlenen ve operatör bölme ve sentezleme daha uygun olur değerlendirmek yığınları kullanılarak düşünüyorum. Hesap makinesinde, aritmetik ifadeyi tanımlamak için genellikle Infix notasyonu kullanırız.
Operand1 op Operand2
Kontrol matematiksel ifadesini ayrıştırmak için bu tür birçok durumlarda kullanılan Shunting-yard algorithm. This da iyi bir okumadır.
- 1. Hesap makinesi Proje Problemi
- 2. javascript mortgage hesap makinesi
- 3. JavaScript hesap makinesi programı
- 4. Hesap makinesi formu alternatif
- 5. Javascript GPA hesap makinesi, Düğme hesap çalışmıyor
- 6. Metin Tabanlı Hesap makinesi çalışmıyor
- 7. Basit Temel Hesap Makinesi Javafx
- 8. Google Hesap Makinesi nasıl uygulanır?
- 9. Posta kodu mesafe hesap makinesi
- 10. C kodunda GPA hesap makinesi
- 11. sin() Java benim hesap makinesi
- 12. Windows 7 ile Logaritma Hesaplaması Hesap Makinesi
- 13. Parantezli basit bir hesap makinesi nasıl çalışır?
- 14. JavaScript Hesap Makinesi her zaman zeminine yuvarlanıyor
- 15. Google hesap makinesi için resmi bir API var mı?
- 16. WPF Hesap makinesi ile sayısal metin kutusu kontrolü?
- 17. JSON, Android sunucusundan hesap makinesi bilgisine geri dönüyor
- 18. Mac OS X spot eklentisini hesap makinesi gibi nasıl yazabilirim?
- 19. FatalErrorException: Giriş dizesi çok uzun
- 20. Bir formdaki bir giriş değerini değiştirmek için bir if deyimi nasıl kullanılır? Ne istediğimi bir hesap makinesi yapmış
- 21. pasaport: giriş ve hesap kaydı için farklı yönlendirme
- 22. MIPS: Tamsayı Çarpma ve Bölme
- 23. Android için küp hesap makinesi uygulaması yapmaya çalışıyorum ve hatalar alıyorum
- 24. Giriş dizesi doğru biçimde değil. C# (Yeni)
- 25. Gezinme çekmecesine hesap ekleme
- 26. Uyarı: bu yerel kullanılamaz Giriş dizesi
- 27. Python'da bir listeyi bölme
- 28. aspnet kimliği aynı anda giriş yapın aynı hesap oturum açın
- 29. Özel bölme için özel bir bölme olarak sunulmakta özel bölme için başarısız yükleme
- 30. Android hesap yöneticisi - Hesap menüsünün düzeni