Android ANTLR hacer que no funciona correctamente
Estoy intentando utilizar ANTLR en Android, y encontré esto: ANTLR y Android
Después de descargar el AntlrJavaRuntime no estoy seguro de qué hacer, se supone que debo hacer esto:
- La construcción de AOSP, vendor_module_check.mk falla
- Creación de Debug vs. Release en el NDK de Android
- Android ndk ninguna regla para hacer objetivo
- Lectura de archivos de Android.mk en subdirecciones recursivamente
- ¿Qué son export_includes e import_includes files when building Android
1. lunch the appropriate target 2. make AntlrJavaRuntime 3. verify that AntlrJavaRuntime.xml was placed in /system/etc/permissions and 4. AntlrJavaRuntime.jar was placed in /system/framework 5. after this, you can run a normal make
En primer lugar, ¿qué significa el primer paso?
En segundo lugar, cuando intento hacer: make AntlrJavaRuntime consigo el error siguiente:
~/AntlrJavaRuntime$ make AntlrJavaRuntime make: Nothing to be done for `AntlrJavaRuntime'.
Es muy difícil encontrar documentación sobre esto, por lo que cualquier ayuda es muy apreciada (o un claro ejemplo de cómo preparar ANTLR para un proyecto de Android).
- ¿Cómo funciona la dependencia de módulos en Android?
- Android.mk wilcard extra 'jni' en el camino?
- Cómo calcular la cobertura de la prueba con Robolectric
- Referencia indefinida a 'typeinfo for testing :: Test' con Google Test en Android NDK
- Incluye biblioteca estática pre-construida en el sistema de compilación de Android
- Android no puede construir el proyecto con NDK-Build.cmd de NDK r7
- Per-file CPPFLAGS en Android.mk
- ¿Cómo hacer un android mm limpio?
Bueno, acabo de hacer una pequeña prueba con una versión "sencilla" de ANTLR, y todo salió bien.
Esto es lo que hice:
1 nuevo proyecto Android
Crea un nuevo proyecto llamado AndAbac
(Android-Abacus) con un paquete llamado bk.andabac
y una actividad llamada AndAbac
.
2 crear una gramática
Cree un archivo de gramática llamado Exp.g
(explicación aquí ) en cualquier parte de su sistema y pegue lo siguiente:
grammar Exp; @parser::header { package bk.andabac; } @lexer::header { package bk.andabac; } eval returns [double value] : exp=additionExp {$value = $exp.value;} ; additionExp returns [double value] : m1=multiplyExp {$value = $m1.value;} ( '+' m2=multiplyExp {$value += $m2.value;} | '-' m2=multiplyExp {$value -= $m2.value;} )* ; multiplyExp returns [double value] : a1=atomExp {$value = $a1.value;} ( '*' a2=atomExp {$value *= $a2.value;} | '/' a2=atomExp {$value /= $a2.value;} )* ; atomExp returns [double value] : n=Number {$value = Double.parseDouble($n.text);} | '(' exp=additionExp ')' {$value = $exp.value;} ; Number : ('0'..'9')+ ('.' ('0'..'9')+)? ; WS : (' ' | '\t' | '\r'| '\n') {$channel=HIDDEN;} ;
3 descarga ANTLR y generar lexer / parser
Descargue ANTLR aquí: http://www.antlr3.org/download/antlr-3.3-complete.jar y póngalo en el mismo directorio que su archivo Exp.g
Genere un lexer y un parser (explicación aquí ) y copie los archivos .java
generados en la siguiente carpeta en su proyecto de Android: src/bk/andabac
. También ponga este tarro ANTLR en el classpath de su proyecto de Android.
4 cambiar algunos archivos de proyecto
Pegue lo siguiente en res/layout/main.xml
:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <EditText android:id="@+id/input_text" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="5 * (8 + 2)" /> <Button android:id="@+id/parse_button" android:layout_height="wrap_content" android:layout_width="fill_parent" android:text="eval" /> <TextView android:id="@+id/output_text" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="" /> </LinearLayout>
Y lo siguiente en src/bk/andabac/AndAbac.java
:
package bk.andabac; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.TextView; import org.antlr.runtime.ANTLRStringStream; import org.antlr.runtime.CommonTokenStream; import org.antlr.runtime.RecognitionException; public class AndAbac extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); final Button button = (Button)findViewById(R.id.parse_button); button.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { EditText in = (EditText)findViewById(R.id.input_text); TextView out = (TextView)findViewById(R.id.output_text); String source = in.getText().toString(); ExpLexer lexer = new ExpLexer(new ANTLRStringStream(source)); ExpParser parser = new ExpParser(new CommonTokenStream(lexer)); try { out.setText(source + " = " + parser.eval()); } catch (RecognitionException e) { out.setText("Oops: " + e.getMessage()); } } }); } }
5 prueba la aplicación
Ejecute el proyecto en un emulador o cree un archivo APK e instálelo en un dispositivo Android (probé ambos y funcioné). Verá lo siguiente después de presionar el botón eval :
Esta respuesta tal vez un poco tarde, pero de todos modos …
Soy el autor del puerto Antlr. Esas fuentes están destinadas a ser utilizadas dentro del código fuente de Android. Sin embargo, sólo incluir las fuentes en su proyecto andriod debe resolver su problema.
Debería haber mencionado que las instrucciones de construcción son sólo cuando se agrega Antlr al código fuente del sistema operativo Android.
-Earlencia
- Comportamiento extraño – Fragmento de VideoViewer no funciona con MediaController
- Cambiar tamaño del borde inferior de EditText