2016-03-23 28 views
3

私はValaについて少し勉強しようとしており、Gtkの動作をテストするためにCalculatorを作成したいと考えていました。問題は、必要な操作を含む文字列を解析する方法があると仮定して、すべてのものをコーディングしたことです。Vala - 構文解析

string operation = "5+2/3*4" 

私はPythonでこれを行いました。これはコンパイラパーサーを使用するのと同じくらい簡単です。私はPythonが数学指向であると理解していますが、私は答えとして私を待っているValaライブラリがあるだろうと思っていました...それが存在すれば見つけられませんでしたが、文字列のドキュメントを見ていたとき、一部:私は、これは限り正確仮定ではないことを理解

stdout.printf(@"$(operation)") 

/* Strings prefixed with '@' are string templates. They can evaluate 
* embedded variables and expressions prefixed with '$'. 
* Since Vala 0.7.8. 
*/ 
string name = "Dave"; 
println (@"Good morning, $name!"); 
println (@"4 + 3 = $(4 + 3)"); 

だから...私はこのような何か多分、多分それはそのように動作させるための方法があったことを考えました変数を代用するだけで、実際に変数を評価するためのさらなるステップが必要になります。

今私が抱いている2つの主な疑問は次のとおりです。a)これを実行できるライブラリ関数はありますか? b)文字列テンプレートを使用して解決策を試すことは可能ですか?

+0

文字列テンプレートのアプローチはここではうまくいかないでしょう。 Valaが簡単には提供しない完全な表現パーサーが必要です。 –

+0

[GNOME電卓](https://git.gnome.org/browse/gnome-calculator/tree/src)は、Valaで書かれています(参考になる場合)。 – AlThomas

答えて

0

libvala(これはコンパイラの一部です)を使用して式を解析できます。

​​a CodeContextであり、Valaパーサを(複数の).valaファイルで実行します。

次に、構文木の必要なノードを訪問して式を評価する独自のCodeVisitorクラスを作成することができます。

私が見る限り、まだこれを行う表現評価者はいません。これは、通常はバラコードがCコードに変換され、Cコンパイラが時刻式の評価をコンパイルするか、完成した実行可能ファイルがランタイム評価を行うためです。

Pythonは主にスクリプト言語であり、ランタイム/インタプリタに直接評価ビルドされているため、Pythonは異なります。

+0

私はvapiファイルを介してC++のmathevalライブラリをバインドする方法を見つけましたが、CodeContextクラスとCodeVisitorクラスについてもう少し説明できますか? –

+0

何を知りたいですか? stackoverflowはディスカッションフォーラムではありません。さらに具体的な質問がある場合は、新しい質問をしてください。 –

+0

コンパイラの仕組みに興味があるなら、バラのソースコードを勉強することをお勧めします:https://git.gnome.org/browse/vala/tree/ Hacking Valaのページにはhttps ://wiki.gnome.org/Projects/Vala/Hacking –

2

これは私が仕事をすることがわかったものです。私はC++のlibmathevalライブラリを使っていましたが、これは最初にvaファイルをValaにバインドする必要がありました。私はhereを見つけた。プロジェクトの下にはvala-extra-apisという名前の利用可能なvapiファイルがたくさんあります。インストール時には含まれていませんが、GNOMEのVala List of Bindingsで認識されます。