2015-04-23 13 views
6

Jaki jest właściwy sposób sprawdzenia, czy dana linia to kod Java?Jak sprawdzić, czy dany wiersz kodu jest napisany w java?

Wejście: LogSupport.java:44 com/sun/aktywacja/rejestry/log LogSupport (Ljava/lang/String;) V

Oczekiwany Wyjście false.

Input: Scanner in = new Scanner (System.in);

Oczekiwany wynik: prawda.

Próbowałem Eclipse JDT ASTParser, aby sprawdzić, czy możemy stworzyć AST. Oto kod:

public static boolean isJava(String line) { 
    boolean isJava = false; 
    ASTParser parser = ASTParser.newParser(AST.JLS3); 
    parser.setSource(line.toCharArray()); 
    parser.setResolveBindings(false); 
    ASTNode node = null; 

    parser.setKind(ASTParser.K_STATEMENTS); 
    try { 
     node = parser.createAST(null); 
     if (node == null) return false; 
     isJava = true; 
    } catch (Exception e) { 
     return false; 
    } 
    return isJava; 
} 

Ale to nie działa. Jakieś pomysły? Dzięki!

+2

Co oznacza "to nie działa"? Czy otrzymujesz błąd? Czy wyniki różnią się od oczekiwanych? Może parser oczekuje kompletnego pliku źródłowego Java, a nie tylko pojedynczej linii (która nie jest poprawnym, kompletnym plikiem źródłowym Java). – Jesper

+0

Rzeczywiście, Java nie jest językiem kompilowanym i/lub interpretowanym wiersz po linii. Jako przykład można podać deklarację zmiennej, nie można jej po prostu zbudować na AST, ponieważ reguły nie będą w stanie określić, czy jest to lokalna zmienna metody czy atrybut klasy. – Gimby

+0

Które oświadczenie analizujesz? Co to jest w 'line.toCharArray()'? – LittlePanda

Odpowiedz

4

Spróbuj BeanShell

http://www.beanshell.org/intro.html

Java funkcje ewaluacji:

ocenić pełnych klas Java źródłowych dynamicznie jak również pojedyncze metody Java, oświadczeń i wyrażeń.

Podsumowanie funkcji

Dynamiczne wykonanie pełnej składni Javy, kod Java fragmentów, a także luźno wpisywanych Java i skryptów dodatkowy komfort.

Przejrzysty dostęp do wszystkich obiektów Java i interfejsów API.

Działa w czterech trybach: Wiersz poleceń, konsola, aplet, serwer zdalnej sesji. Może pracować w środowiskach o ograniczonym dostępie bez generowania klas ani kodu bajtowego dla większości funkcji.

Interpreter jest małym plikiem jar o pojemności 150K.

Czysta Java.

To nic nie kosztuje!

poniższy link ma jakąś inną opcję można spróbować

Syntax Checking in Java

1

Co chcesz podobno ma zdecydować, czy ciąg masz jest ważny podciąg języka Java.

Oczywiście, aby to zrobić, potrzebujesz pełnego parsera Java jako podstawy. Niektóre parsujące maszyny mogą pozwolić ci na parsowanie napisu jako nieterminalnego w języku; jest to względnie łatwe w przypadku parserów rekursywnych. (Wygląda na to, że analizowanie Eclipse oferuje to na przykładzie OP).

Ale jeśli chcesz zaakceptować podciąg (np.g,

 57).x=2; foo[15].bar(abc>= 

to poprawny fragment Javy, potrzebujesz maszyny do parsowania specjalizowanej do obsługi tego.

Nasz DMS Software Reengineering Toolkit z jego Java Front End zrobi to. Interfejsy API parsera udostępniają funkcje "analizowania pełnej jednostki kompilacji", "analizowania nieterminalnego" i "analizowania podciągu". Pierwsze dwa drzewa zwracające; ten ostatni zwraca sekwencję drzew. Nie jest to dość arbitralny podciąg; nie można rozpocząć ani zakończyć w środku tokena (np. literał ciągu znaków). Poza tym analizuje arbitralne podciągi.

Powiązane problemy