2016-09-23 6 views
1

与えられた文字列が(Javaの構文に従って)有効なJava式であるかどうかを調べたいと思います。例えば文字列がJavaで有効なJava式であるかどうかを調べる方法は?

object.apply() 
x == 2 
(x != null) && x.alive 

は、Javaのすべての有効な式です。 しかし:

object.apply(); 
== 
for(int i=1; i < n; ++i) i.print(); 

は、Javaでの有効な式(いくつかは、有効なステートメントですが、これは私が探しているものではありません)されていません。

簡単な解決策はありますか?文字列が有効な識別子であるかどうかを判断したい場合は、isJavaIdentifierStartisJavaIdentifierPartのようにしてください。

+6

一般的なケースでは、Javaパーサーを構築しようとしているようです。 –

+0

クラスにコードを追加してファイルに書き込んでコンパイルすることができます.Java 9にはREPLがありますので、簡単になると思います。 –

+0

それは助けることができるhttp://javaparser.org/ –

答えて

1

いいえ、Stringが有効なJavaコードであるかどうかを簡単にチェックする方法はありません。私は2つの方法しか考えられません。

をファイルにエクスポートします。1.そして、それが

あなたは.java接尾辞を持つファイルとして文字列を保存し、それをコンパイルすることができcomplie。コンパイルの結果によると、文字列が有効かどうかはわかります。

2. Javaのパーサ

あなたはそれを行うことができるライブラリーを見つけることができます。 JavaCCをご覧ください。ここで私は自分のサイトから引用します:

パーサジェネレータは、文法仕様を読み込んで、その文法との一致を認識できるJavaプログラムに変換するツールです。

+0

2番目のアプローチは簡単です。参照解決の問題をフィルタ処理する必要がないためです。 – talex

1

「有効なJava式」の概念は... rubberyです。例えば

1 == true 

は構文的に有効ですが、==は、これらの型を持っているとオペランドと一緒に使用することはできませんので、Javaコンパイラはそれを拒絶するでしょう。その後:

x.length() == 42 

は、またはxの宣言された型に応じて、有効であってもなくてもよいです。


式が構文的に有効かどうかに関心がある場合は、Java言語のサブセット用のパーサーで十分です。

一方、Javaプログラムに埋め込まれたときに式がコンパイル可能かどうかを確認するには、式を同等のコンテキストに埋め込み、実際のJavaコンパイラでコンパイルするのが最も簡単な方法です。

-1

あなたはANTLR

でパーサを作成することができますし、独自のルールを定義することができます。

3

Java言語標準仕様に従って、Javaコンパイラが解析するのと同じ方法で式を解析する必要があります。

独自のパーサをゼロから構築することはお勧めできません。 Java構文は過去10年間で複雑になってきました。既存のJavaパーサを見つけて再利用して、ホイールを間違って再作成する必要はありません。

JavaCCとANTLRはどちらもJava形式で使用でき、Java文法が定​​義されています。私はそれらをプライム候補とみなすことをお勧めします。複雑なのは、これらのパーサーが式ではなく完全なプログラムを解析することです。式をゴールルールにするように文法を修正し、生成する可能性のある文法の競合を修正することで修正できます。私はあまり期待しないだろう。

もっと複雑な問題:構文が有効であるという理由だけで、式が有効であるとは限りません。私は、Javaの構文が受け入れることをかなり確信している:

"abc" * 17.2 

として有効構文

あなたは、式の妥当性を確認したい場合は、型チェック式は、背景タイプ情報を提供するために評価されるコンテキストを使用して、にそれをする必要があります。それ以外の場合は1が有効なものとしてこれを受け入れます:

s * d // expression that parses correctly, but isn't valid 

を背景知識が、このとき:

Object s; 
char d; 

がフルタイプのチェックを行うことは非常に、非常に困難です。実際の問題として、型チェックを解析して実行する完全なJavaコンパイラフロントエンドが必要です。 パーサージェネレーター(ANTLR、JavaCCなど)は、これを行うのに役立つゼロを提供します。

Javaコンパイラを使用するか、Javaフロントエンドを検索します。いくつかあります。 [完全開示:私の会社はこれを行うことができる会社を提供する]。

関連する問題