2017-06-17 11 views
1

ここではプログラミングに新しいがありますので、これがむしろ基本的であれば謝ります。異なる変数タイプに文字列を解析する

文字列を異なるタイプの実際の変数に変換しようとしています。これらの行は、この時点で、すべての文字列です

double d1, d2 = 3.14, d3; 
int a, b = 17, c, g; 
global int gInt = 1; 
final int fInt = 2; 
String s1, s2 = "Still with me?", s3; 

: 私の入力は、次の形式のファイルです。私は文字列から変数を抽出し、実際の変数を受け取って、それらを使用して操作できるようにしたいと思います。

これまでのところ、私はregexを使ってみましたが、私はここでうんざりしています。どのようにこれが可能かについてのある方向性が大好きです。 私は、例えば、一般的なタイプのフォーマットを作ることを考えた:

public class IntType{ 
     boolean finalFlag; 
     boolean globalFlag; 
     String variableName; 

     IntType(String variableName, boolean finalFlag, boolean globalFlag){ 
     this.finalflag = finalFlag; 
     this.globalFlag = globalFlag; 
     this.variableName = variableName; 
     } 
} 

変数の型ごとに、新しいラッパーを作成します。

私は、作成したラッパーと、重複した宣言などをチェックしたいと思います。

しかし、私が正しい道にいるかどうかはわかりません。

注:悪いフォーマットを無視(つまりなし「;」終わりなど)

+0

私はこの種のもののために正規表現を使用するのではなく、このタイプの作業のために特別に作られたツールを使用します。あなたが探しているものは字句解析ツールですが、私はこの仕事をしません。再度正規表現は行く方法ではないことを確信しています。 –

+0

各ストリングラインは繰り返し可能なフォーマットに従っていますか?はいの場合はどちらですか?入力のサンプルを与える。さもなければ、値が特定のタイプに割り当てられなければならないかどうかを知る方法?例えば、doubleとintの両方が '2'に合うかもしれません。 – davidxxx

+0

おそらく[ANTLR](http://www.antlr.org/)があなたが探しているものです。繰り返しますが、私はこの分野の専門家ではないので、答えを投稿するのではなく、コメントを投稿しています。 –

答えて

0

私はJavaの経験がないが、限り私の知識が私を提供していますように、実際に変数を作成することはできません任意の言語のファイルを使用します。あなたは、特定の種類のアイテムの可変量を保持することができる何らかの種類のリストオブジェクトを作成したいと思うでしょう。次に、ファイルから値を読み込み、必要な型に解析して、対応する型のリストに保存することができます。

編集:私はあなただったら、可能な場合

、私は私のファイルのレイアウトを変更します。それは、このようなものになります。擬似コードで

1 2 3 4 //1 int, 2 floats, 3 booleans and 4 strings 
53 
3.14 
2.8272 
true 
false 
false 
#etc. 

を次のように、あなたはそれを読んでいました:

string[] input = file.Readline().split(' '); // Read the first line and split on the space character 
int[] integers = new int[int.Parse(input[0])] // initialise an array with specefied elements 
// Make an array for floats and booleans and strings the same way 
while(not file.eof) // While you have not reached the end of the file 
{ 
    integers.insert(int.Parse(file.ReadLine())) // parse your values according to the size which was given on the first line of the file 
} 

を使用すると、ファイルのレイアウトを変更することができない場合は、あなたが行う必要があるでしょういくつかのスマートな文字列を分割してファイルから値を抽出し、さらに値を追加するときにサイズ変更する何らかの種類の動的配列を作成します。

MORE EDITS:あなたのコメントに基づいて

あなたは最初の '=' 文字で分割することをお勧めします。分割の前半からタイプを検索し、後半から '、'で分割してすべての値を見つけることができます。

+0

これは、私が2番目のコードブロックを書いたときに私が行っていたところです。しかし、名前と値を効果的に抽出する方法はわかりません。 私は、正規表現をa =#(somenumber)の形式に使うことができると考えました これはint型であると仮定すると、私のパターンは次のようになります:[A-Za-z] +(\\ s)?=(\\ s) ?[0-9] + しかし、私はそれを効果的に使用してその価値を抽出する方法がわかりません。 – YonMan

+0

残念ながら、私はフォーマットを変更することはできません。 私はコードファイルを読んで、それらが正しく動作することを確認したいと思います。実行されないので、コードの入力のタイプを変更することはできません。 – YonMan

1

他の人はこれが不可能だと言っているが、実際はそうである。しかし、それはJavaに多少深く入ります。 java dynamic classloadingを検索してください。例: Method to dynamically load java class files

実行時に動的にJavaファイルを読み込むことができます。しかし、あなたの現在の入力には、Javaファイルのようには見えませんが、それは簡単のような小さなラッパークラスでそれをラップすることにより、1に変換することができます。

public class CodeWrapper() { 
    // Insert code from file here 
} 

あなたはressourceをロードする前に、簡単にファイルやテキストの操作でこれを行うことができますクラスとして。

あなたがクラスをロードした後、あなたが

Field[] fields = myClassObject.getClass().getFields(); 

により、たとえば、reflection経由でその変数にアクセスすることができます。これは、あなたが可視性修飾子、変数の型、名前、コンテンツなどにアクセスすることができます。

もちろん、このアプローチでは、コードが実際に有効なJavaコードであることが前提です。 そうでない場合、それを確認しようとしている場合は、ロードしようとすることができます。失敗した場合、それは無効です。

+0

ありがとうございます。私はすぐにそれを調べます。うまくいけば、それは助けになるだろう。 – YonMan